因此,在 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 版本中吗?
最佳答案
这并不是真正的错误,就像您在问题中建议的那样与缓冲区大小有关。将缓冲区大小设置得更大可以解决这个问题(目前...):
>>> 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
第一行的 View 。
这意味着第一行中的所有 5000 个值将自己正确除法,第二行也将正确到索引 3192。接下来将剩余的 1808 个值放入缓冲区进行就地除法,但第一行已经改变:arr[0]
现在只是一行的 View ,因此后面几列中的值将仅除以一个。
关于python - 划分数组时 numpy 中的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33674967/