首页 > 解决方案 > Numpy:这段代码彼此有何不同?

问题描述

r是一个数组,其中每个元素都是一个列索引(小于N,大小rM)并且P是一个MxN数组。

以下两个片段的行为不同。为什么?

1.

P[:, r] += 1

2.

for i in range(len(r)):
    P[i, r[i]] += 1

标签: pythonnumpy

解决方案


第一个为 的每个元素选择一整列r。第二个只是一个元素。您可以像这样直接比较这两种情况:

>>> P = np.arange(12).reshape(4, 3)
>>> r = np.random.randint(0, 3, (4,))
>>> r
array([1, 1, 2, 0])
>>> 
>>> P[:, r]
array([[ 1,  1,  2,  0],
       [ 4,  4,  5,  3],
       [ 7,  7,  8,  6],
       [10, 10, 11,  9]])
>>> P[np.arange(4), r]
array([1, 4, 8, 9])

正如你所看到的,第二个基本上产生了第一个的对角线。

您可能会从numpy docs中的“结合高级和基本索引”部分中受益。


推荐阅读