6

简而言之:有一个类似的问题,最好的答案建议使用numpy.bincount. 我需要同样的东西,但需要一个矩阵。

我有两个数组:

array([1, 2, 1, 1, 2])
array([2, 1, 1, 1, 1])

他们一起制作了应该增加的索引:

>>> np.array([a, b]).T
array([[1, 2],
       [2, 1],
       [1, 1],
       [1, 1],
       [2, 1]])

我想得到这个矩阵:

array([[0, 0, 0],
       [0, 2, 1],  # (1,1) twice, (1,2) once
       [0, 2, 0]]) # (2,1) twice

矩阵会很小(例如 5×5),而索引的数量会很大(接近 10^3 或 10^5)。

那么,有什么比for-loop 更好(更快)的吗?

4

2 回答 2

4

您仍然可以使用bincount(). 诀窍是将ab转换为单个一维平面索引数组。

如果矩阵是nx m,您可以应用bincount()a * m + b并根据结果构造矩阵。

以您的问题为例:

In [15]: a = np.array([1, 2, 1, 1, 2])

In [16]: b = np.array([2, 1, 1, 1, 1])

In [17]: cnt = np.bincount(a * 3 + b)

In [18]: cnt.resize((3, 3))

In [19]: cnt
Out[19]: 
array([[0, 0, 0],
       [0, 2, 1],
       [0, 2, 0]])

如果数组的形状更复杂,它可能更容易使用,np.ravel_multi_index()而不是手动计算平面索引:

In [20]: cnt = np.bincount(np.ravel_multi_index(np.vstack((a, b)), (3, 3)))

In [21]: np.resize(cnt, (3, 3))
Out[21]: 
array([[0, 0, 0],
       [0, 2, 1],
       [0, 2, 0]])

(帽子提示@Jaime 指出ravel_multi_index。)

于 2013-04-10T08:11:59.333 回答
2
m1 = m.view(numpy.ndarray) # Create view
m1.shape = -1 # Make one-dimensional array
m1 += np.bincount(a+m.shape[1]*b, minlength=m1.size)
于 2013-04-10T08:11:51.300 回答