python - Numpy:为什么 'a += a.T' 不起作用?

标签 python numpy

如 scipy 讲义中所述,这不会按预期工作:

a = np.random.randint(0, 10, (1000, 1000))
a += a.T
assert np.allclose(a, a.T)

但是为什么?作为 View 如何影响此行为?

最佳答案

a += a.T

就地求和(在处理时使用 View a.T),所以你最终得到一个非对称矩阵 你可以很容易地检查这个,即我得到了:

In [3]: a
Out[3]: 
array([[ 6, 15,  7, ...,  8,  9,  2],
       [15,  6,  9, ..., 14,  9,  7],
       [ 7,  9,  0, ...,  9,  5,  8],
       ..., 
       [ 8, 23, 15, ...,  6,  4, 10],
       [18, 13,  8, ...,  4,  2,  6],
       [ 3,  9,  9, ..., 16,  8,  4]])

你可以看到它不是对称的,对吧? (比较右上和左下的项目)

如果你做一个真实的副本:

a += np.array(a.T)

它工作正常,即:

In [6]: a
Out[6]: 
array([[ 2, 11,  8, ...,  9, 15,  5],
       [11,  4, 14, ..., 10,  3, 13],
       [ 8, 14, 14, ..., 10,  9,  3],
       ..., 
       [ 9, 10, 10, ..., 16,  7,  6],
       [15,  3,  9, ...,  7, 14,  1],
       [ 5, 13,  3, ...,  6,  1,  2]])

为了更好地理解它为什么这样做,您可以想象您自己编写了如下循环:

In [8]: for i in xrange(1000):
            for j in xrange(1000):
                a[j,i] += a[i,j]
   ....:         

In [9]: a
Out[9]: 
array([[ 4,  5, 14, ..., 12, 16, 13],
       [ 3,  2, 16, ..., 16,  8,  8],
       [ 9, 12, 10, ...,  7,  7, 23],
       ..., 
       [ 8, 10,  6, ..., 14, 13, 23],
       [10,  4,  6, ...,  9, 16, 21],
       [11,  8, 14, ..., 16, 12, 12]])

它添加 a[999,0] 来计算 a[0,999] 但 a[999,0] 已经有 a[999,0] + a[0,999] 的总和 - 所以在主对角线下方添加值两次。

关于python - Numpy:为什么 'a += a.T' 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36787025/

相关文章:

sql - PostgreSQL/Pandas 插入包含 null/np.nan/空值的稀疏数组

python - 用 X 相邻值的平均值替换 Numpy 数组中大于阈值的所有元素

python - 使用 matplotlib轮廓/轮廓处理循环数据

python - 正则表达式在逗号之间选择和替换字符串不包括预期的逗号

python - Scrapy:如何提取 HTML 标签内的所有单词?

python - 将带有包装标题的 excel 文件读入 pandas

python - 在条件列表上使用逻辑AND的PySpark DataFrame过滤器-Numpy All Equivalent

Python - 解析 graphql,添加一些东西,然后返回查询字符串

python - JIRA Python 项目类别

python - 根据索引位置连接一维和二维数组