划分数组时 numpy 中的意外行为

Unexpected behaviour in numpy, when dividing arrays

因此,在 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 第一行的视图。

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