我有形状为(3000,4)的数据,特征为(产品,商店,星期,数量)。数量是目标。
所以我想将此矩阵重构为张量,而无需混合相应的量。
例如,如果有30个产品,20个存储区和5个星期,则张量的形状应为(5、20、30),并具有相应的数量。因为整个数据中不会有两次类似(商店A,产品X,第3周)的条目,所以每个商店x产品x周对应该有一个对应的数量。
关于如何实现此目标的任何建议,还是存在任何逻辑错误?谢谢。
答案 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”对应;商店和周的想法相同。完成所有这些操作后,您可以简单地遍历现有数组的所有行,并根据存储在转换矩阵中的产品,商店和周各值的索引,将数量的值分配给新数组内的正确位置。正如您所说,这是有道理的,因为存在一对一的对应关系。