Numpy 未能正确排列数组

Posted

技术标签:

【中文标题】Numpy 未能正确排列数组【英文标题】:Numpy failing to properly square array 【发布时间】:2015-01-23 14:28:27 【问题描述】:

我正在尝试映射一个简单的二次函数,其中 zs 是一个 numpy 数组,R 是一个常数

Ns = -np.square(zs) + 2*zs*R+ 3*R**2

它在大多数情况下都可以正常工作,但由于某种原因,每当我按照代码中断的方式设置评估时:

>>>zs = np.array(range(80262,80268)
>>>R = 26756
>>>Ns = -np.square(zs) + 2*zs*R+ 3*R**2
>>>print Ns
array([    642108,    535095,    428080,    321063,    214044
       4295074319], dtype=int64)

数组中的最后一个值应该是 107023。每当我超过 80267 时,平方函数就会完全中断并开始给我绝对荒谬的答案。这只是一个数据类型错误,还是这里发生了我不知道的其他事情?

【问题讨论】:

【参考方案1】:

问题在于zs = np.array(range(80262,80268)) 创建了一个int32 值数组。

np.square(zs) 返回一个数据类型与zs 相同的数组,数组中的最终平方值溢出它分配的四个字节的内存。

您会看到 Ns = -np.square(zs) + 2*zs*R+ 3*R**2 的数据类型为 int64,因为 NumPy 为该数组提供了更多内存以容纳更大的数字。但是,为时已晚:np.square(zs) 中的值已经溢出。

要解决此问题,请使用 np.int64 数据类型创建 zs

zs = np.arange(80262, 80268, dtype=np.int64)

请注意,如果zs 中的数字足够大,同样的问题会再次出现!

【讨论】:

以上是关于Numpy 未能正确排列数组的主要内容,如果未能解决你的问题,请参考以下文章

使用 numpy 生成数组排列的长列表(重复)

如何在numpy中优雅地通过子数组重新排列数组?

创建numpy数组,其中值在其他两个相同大小排列的范围内

如何从一个1d Numpy数组的所有排列组合中删除所有的圆台排列组合?

正确将 png 转换为 npy numpy 数组(图像到数组)

Python Numpy - 无法正确保存/加载数组