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

标签 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 版本中吗?

最佳答案

这并不是真正的错误,就像您在问题中建议的那样与缓冲区大小有关。将缓冲区大小设置得更大可以解决这个问题(目前...):

>>> 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/

相关文章:

javascript - 如何访问javascript中的文档

c - snprintf() 在内部调用 memset() 或类似的吗?

PHP - 在多维数组中查找键

python - 属性错误: 'OLSResults' object has no attribute 'norm_resid'

通过 IDLE 运行的 Python 脚本没有输出

python - 通过其他应用程序在 GtkDrawingArea 中绘图

python - 检查txt文件中是否包含ID

javascript - Jquery 将值添加到数组(如果不存在)

Python:如何在不使用更多 RAM 的情况下将 np 数组/列表拆分为两个数组/列表

python - 如何在Python中填充矩阵以使其大小均匀