Numpy麻烦矢量化某种聚合

时间:2016-07-29 00:03:55

标签: python numpy

我很难对以下操作进行矢量化:

# x.shape = (a,)
# y.shape = (a, b)
# x and y are ordered over a.
# Want to combine x, y into z.shape(num_unique_x, b)

# Below works and illustrates intent but is iterative
z = np.zeros((num_unique_x, b))

for i in range(a):
    z[x[i], y[i, :]] += 1

1 个答案:

答案 0 :(得分:1)

您对num_unique_x的使用以及z的大小表明,这是xy重复的情况,以及某些{{1}将大于1.在这种情况下,我们需要使用z。但为了说明这一点,我已经审查了它的文档,并可能测试了一些替代方案。

但首先是一个不重复的案例

np.add.at

了解我为什么要求提供诊断示例。我猜测可能的价值观。我必须制作一个超过3列的In [522]: x=np.arange(6) In [523]: y=np.arange(3)+x[:,None] In [524]: y Out[524]: array([[0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7]])

z

向量化等价物

In [529]: z=np.zeros((6,8),dtype=int)
In [530]: for i in range(6):
     ...:     z[x[i],y[i,:]]+=1 
In [531]: z
Out[531]: 
array([[1, 1, 1, 0, 0, 0, 0, 0],
       [0, 1, 1, 1, 0, 0, 0, 0],
       [0, 0, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 0, 0],
       [0, 0, 0, 0, 1, 1, 1, 0],
       [0, 0, 0, 0, 0, 1, 1, 1]])

相应的In [532]: z[x[:,None],y] Out[532]: array([[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]]) In [533]: z[x[:,None],y] += 1 In [534]: z Out[534]: array([[2, 2, 2, 0, 0, 0, 0, 0], [0, 2, 2, 2, 0, 0, 0, 0], [0, 0, 2, 2, 2, 0, 0, 0], [0, 0, 0, 2, 2, 2, 0, 0], [0, 0, 0, 0, 2, 2, 2, 0], [0, 0, 0, 0, 0, 2, 2, 2]]) 表达式是

add.at

这适用于这种不重复的情况。

对于In [538]: np.add.at(z,(x[:,None],y),1) In [539]: z Out[539]: array([[3, 3, 3, 0, 0, 0, 0, 0], [0, 3, 3, 3, 0, 0, 0, 0], [0, 0, 3, 3, 3, 0, 0, 0], [0, 0, 0, 3, 3, 3, 0, 0], [0, 0, 0, 0, 3, 3, 3, 0], [0, 0, 0, 0, 0, 3, 3, 3]]) 中的重复:

x

如果没有In [542]: x1=np.array([0,1,1,2,3,5]) In [543]: z1=np.zeros((6,8),dtype=int) In [544]: np.add.at(z1,(x1[:,None],y),1) In [545]: z1 Out[545]: array([[1, 1, 1, 0, 0, 0, 0, 0], [0, 1, 2, 2, 1, 0, 0, 0], [0, 0, 0, 1, 1, 1, 0, 0], [0, 0, 0, 0, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 1, 1]]) ,我们会错过add.at

2s