当应用于 int 数组时,einsum 没有给出溢出错误
einsum not giving overflow error when applied to int arrays
我刚刚有一个错误是基于 np.sum
和一个等价的(或者至少我是这么认为的...)np.einsum
命令没有给出相同的结果。这是一个例子:
import numpy.random
array = np.random.randint(-10000, 10000, size=(4, 100, 200, 600), dtype=np.int16)
sum1 = np.sum(array, axis=(0,1,2))
sum2 = np.einsum('aijt->t', array)
print(np.allclose(sum1, sum2))
plt.figure()
plt.plot(sum1)
plt.plot(sum2)
plt.show()
经过一番查找,这是整数数据类型溢出造成的。
我的问题:
- 为什么
np.einsum
没有给出与 np.sum
相同的结果?我觉得 np.sum 行为更可取,错误更少。
- 为什么
np.einsum
不抛出溢出错误或至少不抛出警告?就使用它时隐藏的错误而言,这是非常可怕的。我是否应该在每次使用命令时手动检查这些?
- 这会被认为是 numpy 中的错误吗?
定义大int16
:
In [322]: y=np.int16(32000)
添加产生警告:
In [323]: y+y
C:\Users\paul\AppData\Local\Temp\ipykernel_882814217578.py:1: RuntimeWarning: overflow encountered in short_scalars
y+y
Out[323]: -1536
sum
将它们提升为更大的整数,并且没有警告:
In [324]: np.sum((y,y))
Out[324]: 64000
In [325]: _.dtype
Out[325]: dtype('int32')
从中创建一个数组:
In [326]: Y = np.array(y)
无警告溢出:
In [327]: Y+Y
Out[327]: -1536
我不记得细节了,但有人解释说检查数组的每个元素是否溢出 is/was 被认为太昂贵了。
与其检查 'by hand',不如注意溢出的可能性,不要在不必要的情况下使用较小的数据类型。
可能重复
Sum of positive numbers results in a negative number
我刚刚有一个错误是基于 np.sum
和一个等价的(或者至少我是这么认为的...)np.einsum
命令没有给出相同的结果。这是一个例子:
import numpy.random
array = np.random.randint(-10000, 10000, size=(4, 100, 200, 600), dtype=np.int16)
sum1 = np.sum(array, axis=(0,1,2))
sum2 = np.einsum('aijt->t', array)
print(np.allclose(sum1, sum2))
plt.figure()
plt.plot(sum1)
plt.plot(sum2)
plt.show()
经过一番查找,这是整数数据类型溢出造成的。
我的问题:
- 为什么
np.einsum
没有给出与np.sum
相同的结果?我觉得 np.sum 行为更可取,错误更少。 - 为什么
np.einsum
不抛出溢出错误或至少不抛出警告?就使用它时隐藏的错误而言,这是非常可怕的。我是否应该在每次使用命令时手动检查这些? - 这会被认为是 numpy 中的错误吗?
定义大int16
:
In [322]: y=np.int16(32000)
添加产生警告:
In [323]: y+y
C:\Users\paul\AppData\Local\Temp\ipykernel_882814217578.py:1: RuntimeWarning: overflow encountered in short_scalars
y+y
Out[323]: -1536
sum
将它们提升为更大的整数,并且没有警告:
In [324]: np.sum((y,y))
Out[324]: 64000
In [325]: _.dtype
Out[325]: dtype('int32')
从中创建一个数组:
In [326]: Y = np.array(y)
无警告溢出:
In [327]: Y+Y
Out[327]: -1536
我不记得细节了,但有人解释说检查数组的每个元素是否溢出 is/was 被认为太昂贵了。
与其检查 'by hand',不如注意溢出的可能性,不要在不必要的情况下使用较小的数据类型。
可能重复
Sum of positive numbers results in a negative number