2012年11月22日 星期四 08:23
1 2 3 4 5 6 7 8 9 10 | 看到scipy lecture notes上说:transpose is a view<br><br>As a result, a matrix cannot be made symmetric in - place:<br><br><br><br>>>> 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. ]])<br><br><br><br><br>为什么会这样?如果是小点的比如说( 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 © 2025
京ICP备05028076号