numpy中生成对称矩阵的语义

时间:2013-06-13 15:40:06

标签: python matrix numpy symmetric

我尝试制作一个随机对称矩阵来测试我的程序。我根本不关心数据,只要它是对称的(足够的随机性根本不关心)。

我的第一次尝试是:

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

然后就可以了。

这里发生了什么?这些陈述在语义上是否相同?有什么区别?

1 个答案:

答案 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