在划分数组时numpy中出现意外行为

时间:2015-11-12 15:22:55

标签: python arrays numpy division

因此,在numpy 1.8.2(使用python 2.7.6)中,阵列分割似乎存在问题。当对一个足够大的数组(至少8192个元素,多个维度,数据类型不相关)进行就地划分时,对于不同的符号,行为是不一致的。

import numpy as np
arr = np.random.rand(2, 5000)
arr_copy = arr.copy()
arr_copy = arr_copy / arr_copy[0]
arr /= arr[0]
print np.sum(arr != arr_copy), arr.size - np.sum(np.isclose(arr, arr_copy))

输出预计为0,因为两个分区应该是一致的,但它是1808.这是一个错误吗?是否也发生在其他numpy版本中?

1 个答案:

答案 0 :(得分:7)

这不是一个真正的错误,就像你在问题中建议的缓冲区大小一样。将缓冲区大小设置得更大可以解决问题(现在......):

>>> np.setbufsize(8192*4) # sets new buffer size, returns current size
8192 
>>> # same set up as in the question
>>> np.sum(arr != arr_copy), arr.size - np.sum(np.isclose(arr, arr_copy))
(0, 0)

正如您在评论中所述,原位分部arr /= arr[0]是最初出错的地方。仅arr的前8192个元素被arr[0]缓存,只是arr的第一行的视图。

这意味着第一行中的所有5000个值将被自己正确划分,第二行也将正确到索引3192.接下来,剩余的1808个值被放入缓冲区以进行就地划分但是第一行已经更改:arr[0]现在只是一行1的视图,因此后面列中的值只会被除以1。