numpy,transposition是一个视图,并不会使矩阵对称?

fas*_*oth 4 python numpy

阅读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.]])
Run Code Online (Sandbox Code Playgroud)

然后它说: 在此输入图像描述

而且我不明白为什么.我做了一个实验,它确实使它对称. 在此输入图像描述


编辑1:

随机矩阵的结果相同: 在此输入图像描述

Blc*_*ght 5

我想我明白这个警告的目的是什么,虽然我不太了解Numpy内部人员知道为什么问题没有发生.

关键是您在就地添加操作右侧的转置矩阵是正在修改的矩阵的浅视图(不是副本).如果Numpy通过迭代值来执行操作,则某些结果将最终不正确.

考虑像+=(2)矩阵的运算符这样的(粗略)实现:

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
Run Code Online (Sandbox Code Playgroud)

如果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]])
Run Code Online (Sandbox Code Playgroud)

结果不对称的原因是右侧在操作过程中正在发生变化.当lhs[0,1]得到了更新(带rhs[0,1]的3被添加到的1现有值),rhs[1,0]用它改变.所以,当lhs[1,0]轮到来更新时,rhs[1,0]保持修改后的值.

我怀疑警告是关于这个,虽然效果似乎不适用于正常使用中的numpy的内置运营商.也许,引导和警告是为numpy的的早期版本少了助人行为,或者是不好的行为仍然可以显示了即使是在与NumPy的当前版本中某些种类的阵列编写的.我不确定.我怀疑这是一般的好建议,以避免使用视图进行就地修改,即使它不能保证在某些用途中中断.