我尝试制作一个随机对称矩阵来测试我的程序。我根本不关心数据,只要它是对称的(足够的随机性根本不关心)。
我的第一次尝试是:
x=np.random.random((100,100))
x+=x.T
但是,np.all(x==x.T)
返回False。 print x==x.T
产生
array([[ True, True, True, ..., False, False, False],
[ True, True, True, ..., False, False, False],
[ True, True, True, ..., False, False, False],
...,
[False, False, False, ..., True, True, True],
[False, False, False, ..., True, True, True],
[False, False, False, ..., True, True, True]], dtype=bool)
我尝试运行一个n = 10的小测试示例来查看发生了什么,但该示例的工作方式正如您所期望的那样。
如果我这样做:
x=np.random.random((100,100))
x=x+x.T
然后就可以了。
这里发生了什么?这些陈述在语义上是否相同?有什么区别?
答案 0 :(得分:2)
这些语句在语义上不等同。 x.T
返回原始数组的视图。在+=
的情况下,您实际上在迭代它时更改x
的值(这会更改x.T
的值)。
以这种方式思考......当你的算法得到索引(3,4)
时,它在伪代码中看起来像这样:
x[3,4] = x[3,4] + x[4,3]
现在,当您的迭代到达(4,3)
时,您可以
x[4,3] = x[4,3] + x[3,4]
但是,x[3,4]
不是您开始迭代时的情况。
在第二种情况下,您实际上创建了一个新的(空)数组并更改了空数组中的元素(从不写入x
)。所以伪代码看起来像:
y[3,4] = x[3,4] + x[4,3]
和
y[4,3] = x[4,3] + x[3,4]
显然会给你一个对称矩阵(y
。