Python和科学计算认证群组  - 讨论区

标题:numpy中transpose

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哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号