如何在不混合相应条目的情况下将2D矩阵转换为3D张量?

时间:2018-11-15 06:53:58

标签: python tensorflow

我有形状为(3000,4)的数据,特征为(产品,商店,星期,数量)。数量是目标。

所以我想将此矩阵重构为张量,而无需混合相应的量。

例如,如果有30个产品,20个存储区和5个星期,则张量的形状应为(5、20、30),并具有相应的数量。因为整个数据中不会有两次类似(商店A,产品X,第3周)的条目,所以每个商店x产品x周对应该有一个对应的数量。

关于如何实现此目标的任何建议,还是存在任何逻辑错误?谢谢。

2 个答案:

答案 0 :(得分:2)

如果没有虚拟变量,您只需要仔细排序我们的数据即可。 np.lexsort可以做到。

假设您的数据看起来像data

import numpy as np
dims=a,b,c=30,20,5
data=np.array(list(product(*[np.arange(i) for i in dims+(1,)])))
data[:,-1]=np.random.randint(0,100,a*b*c)
np.random.shuffle(data)
#array([[ 4, 15,  0, 56],
#       [27, 16,  2,  3],
#       [ 4,  8,  4, 26],
#       ..., 
#       [20, 14,  3, 28],
#       [14, 10,  4,  6],
#       [19, 14,  3, 39]])

然后可以根据需要进行排序并按以下方式重塑:

sorteddata=data[np.lexsort(data[:,::-1].T)]
tensor=sorteddata[:,-1].reshape(dims)

现在tensor[4,15,0]56。好吧!

答案 1 :(得分:0)

您可以首先浏览前三列中的每一列,然后计算拥有的不同产品,商店和周数。这将为您提供新数组的形状,您可以使用numpy创建它。现在重要的是,您需要为每个类别创建一个转换矩阵。例如,如果乘积为“ XXX”,那么您想知道第一维的哪一行(因为乘积是数组的第一维),“ XXX”对应;商店和周的想法相同。完成所有这些操作后,您可以简单地遍历现有数组的所有行,并根据存储在转换矩阵中的产品,商店和周各值的索引,将数量的值分配给新数组内的正确位置。正如您所说,这是有道理的,因为存在一对一的对应关系。