在阅读scipy讲座时:http://scipy-lectures.github.io/intro/numpy/operations.html
有一个例子:
>>> a = np.triu(np.ones((3, 3)), 1)
>>> a
array([[ 0., 1., 1.],
[ 0., 0., 1.],
[ 0., 0., 0.]])
>>> a.T
array([[ 0., 0., 0.],
[ 1., 0., 0.],
[ 1., 1., 0.]])
然后它说:
我不明白为什么。我做了一个实验,它确实使它对称。
编辑1:
相同的结果适用于随机矩阵:
答案 0 :(得分:5)
我想我明白这个警告的目的是什么,虽然我对Numpy内部人员知之甚少,不知道为什么问题没有发生。
关键是您在就地添加操作右侧的转置矩阵是正在修改的矩阵的浅视图(不是副本)。如果Numpy通过迭代值来执行操作,则某些结果将不正确。
考虑对于2d矩阵的+=
运算符这样的(粗略)实现:
def matrix_iadd(lhs, rhs):
for i in range(lhs.shape[0]):
for j in range(lhs.shape[1]):
lhs[i,j] += rhs[i,j]
return lhs
如果rhs
是与lhs
重叠的视图(如转置),则无法按预期工作。这是一个例子:
>>> a = np.arange(9)
>>> a.shape=(3,3)
>>> a
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> a.T
array([[0, 3, 6],
[1, 4, 7],
[2, 5, 8]])
>>> matrix_iadd(a, a.T)
array([[ 0, 4, 8],
[ 7, 8, 12],
[14, 19, 16]])
结果不对称的原因是右侧在操作过程中正在发生变化。当lhs[0,1]
更新后(将rhs[0,1]
的3添加到现有值1),rhs[1,0]
随之更改。因此,当lhs[1,0]
轮到您更新时,rhs[1,0]
保留了修改后的值。
我怀疑警告是关于此的,虽然效果似乎不适用于正常使用中的numpy内置运营商。也许该指南及其警告是为之前版本的Numpy编写的,其行为不太有用,或者即使在当前版本的Numpy中,也可能仍然会出现某种类型的数组。我不确定。我怀疑这是一般的好建议,以避免使用视图进行就地修改,即使不能保证在某些用途中中断。