所以我总是像这样创建 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 的值时,我不会收到任何警告。这有点可怕。
所以我的问题是:
- 当我使用
int
和float
类型的数组时,是否有可能我在不知情的情况下设置了一个太大的值(导致完全错误的计算)? - 如果我想使用
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/