设r
为一个数组,其中每个元素都是一个列索引(小于N
,r
的大小为M
) 和 P
是一个 M
xN
数组。
以下两个片段的行为不同。为什么?
1.
P[:, r] += 1
2.
for i in range(len(r)):
P[i, r[i]] += 1
最佳答案
第一个为 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 中的“结合高级索引和基本索引”部分.
关于python - Numpy:这段代码彼此有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50439668/