当应用于 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()

经过一番查找,这是整数数据类型溢出造成的。

我的问题:

定义大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