2012年11月22日 星期四 08:23
看到scipy lecture notes上说:transpose is a view
As a result, a matrix cannot be made symmetric in-place:
>>> a = np.ones((100, 100)) >>> a += a.T >>> a array([[ 2., 2., 2., ..., 2., 2., 2.], [ 2., 2., 2., ..., 2., 2., 2.], [ 2., 2., 2., ..., 2., 2., 2.], ..., [ 3., 3., 3., ..., 2., 2., 2.], [ 3., 3., 3., ..., 2., 2., 2.], [ 3., 3., 3., ..., 2., 2., 2.]])
为什么会这样?如果是小点的比如说(10,10)却是对称的……
2012年11月22日 星期四 08:25
渣排版……
2012年11月22日 星期四 12:16
由于a和a.T共享内存,因此 a+=a.T会得到奇怪的结果,这个没有问题。问题是为什么只有一部分是3,而不是下半三角内都是3,而且当n比较小的时候不会有问题。
我觉得这个和numpy的内部实现有关,numpy内部有一个大小为8192的缓存,有时候它会使用此缓存进行计算。由于但n比较小的时候,a.T可能会全部保存到此缓冲中再进行计算,因此不会问题。下面的代码可以大致看出缓存的大小:
a = np.ones((99, 99))
a += a.T
np.where(a.ravel()==3)[0][0]
输出为8912
不过
a = np.ones((100, 100))
a += a.T
np.where(a.ravel()==3)[0][0]
的输出为8200
测试几组n之后,发现最小为8192,也就是说缓存能保准最前面的8912个结果是正确的。
2012年11月24日 星期六 18:15
非常感谢
Zeuux © 2024
京ICP备05028076号