python - 当我设置的值对于给定的数据类型太大时会发生什么?

标签 python numpy

所以我总是像这样创建 numpy 数组:

>>> u = np.zeros( 10, int )
>>> v = np.zeros( 10, float )

到目前为止,我一直没有意识到最大允许值。我一直假设它会起作用。如果没有,我会得到 OverflowError,然后我会找到一些解决方法,例如取对数。

但最近我开始使用其他数据类型:

>>> v8 = np.zeros( 10, np.uint8 )
>>> v8[0] = 2 ** 8 - 1
>>> v8[1] = 2 ** 8
>>> v8
>>> array([255,   0,   0,   0,   0,   0,   0,   0,   0,   0], dtype=uint8)

好吧,当我分配大于 255 的值时,我不会收到任何警告。这有点可怕。

所以我的问题是:

  • 当我使用intfloat类型的数组时,是否有可能我在不知情的情况下设置了一个太大的值(导致完全错误的计算)?
  • 如果我想使用 uint8,是否必须手动检查 [ 0, 255 ] 中的所有分配值?

最佳答案

numpy 在机器级别的工作非常深入。测试非常耗时,因此测试留给了开发人员。 Python 的级别要高得多,许多测试都是自动完成的,或者在整数的情况下,整数可以具有任意大的值。无论在哪里,您都必须在速度和安全性之间做出决定。 numpy 在速度方面更远。

在需要测试取值范围的情况下,你必须自己检查。

剪辑方法可能会帮助您:

>>> u = np.array([124,-130, 213])
>>> u.astype('b')
array([124, 126, -43], dtype=int8)
>>> u.clip(-128,127).astype('b')
array([ 124, -128,  127], dtype=int8)

关于python - 当我设置的值对于给定的数据类型太大时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23322881/

相关文章:

python-3.x - Numpy 将两个不同的linspace组合成一个坐标矩阵

python - 为什么我的 linkExtractor 在 scrapy 蜘蛛中伪装成不抓取允许的链接?

python - 如何打印/存储非 ASCII 字符(unicode?)

python - cPickle 导入错误 : No module named multiarray

python - 如何在 numpy 中使用二维数组构造对角线数组?

python - Numpy:根据形状角选择任意形状

python - 如何在子数据帧上过滤多维数据帧

python - 在 Python 中四舍五入到任意精度的有效方法

python - 基于创建对象时传递的不同参数的 Singleton/Borg 模式

python - 按阈值分隔