重复 numpy 操作的预期行为
Expected behaviour for repeated numpy operations
我在查找有关对 numpy 数组的重复操作的问题时找到了这个答案:Increment Numpy multi-d array with repeated indices。我现在的问题是,为什么会看到这种行为。
import numpy as np
t = np.eye(4)
t[[0,0,1],[0,0,1]]
导致
array([1.,1.,1.])
所以不应该
t[[0,0,1],[0,0,1]]+=1
导致
[[3,0,0,0],
[0,2,0,0],
[0,0,1,0],
[0,0,0,1]]
?
参见 documentation 索引数组和基本索引与高级索引的区别。
t[[0,0,1],[0,0,1]]
属于高级索引类别,如文档中所述:
Advanced indexing always returns a copy of the data (contrast with basic slicing that returns a view).
副本在第一个增量之前计算,所以正如预期的那样,
import numpy as np
t = np.eye(4)
t[[0,0,1],[0,0,1]] += 1
print(t)
打印:
[[ 2. 0. 0. 0.]
[ 0. 2. 0. 0.]
[ 0. 0. 1. 0.]
[ 0. 0. 0. 1.]]
根据上面的评论,使用 numpy.ufunc.at
或 numpy.add.at
来解决这个问题。
我在查找有关对 numpy 数组的重复操作的问题时找到了这个答案:Increment Numpy multi-d array with repeated indices。我现在的问题是,为什么会看到这种行为。
import numpy as np
t = np.eye(4)
t[[0,0,1],[0,0,1]]
导致
array([1.,1.,1.])
所以不应该
t[[0,0,1],[0,0,1]]+=1
导致
[[3,0,0,0],
[0,2,0,0],
[0,0,1,0],
[0,0,0,1]]
?
参见 documentation 索引数组和基本索引与高级索引的区别。
t[[0,0,1],[0,0,1]]
属于高级索引类别,如文档中所述:
Advanced indexing always returns a copy of the data (contrast with basic slicing that returns a view).
副本在第一个增量之前计算,所以正如预期的那样,
import numpy as np
t = np.eye(4)
t[[0,0,1],[0,0,1]] += 1
print(t)
打印:
[[ 2. 0. 0. 0.]
[ 0. 2. 0. 0.]
[ 0. 0. 1. 0.]
[ 0. 0. 0. 1.]]
根据上面的评论,使用 numpy.ufunc.at
或 numpy.add.at
来解决这个问题。