我只是有一個錯誤,它基于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 中的錯誤嗎?
uj5u.com熱心網友回復:
定義一個大的int16:
In [322]: y=np.int16(32000)
加法產生警告:
In [323]: y y
C:\Users\paul\AppData\Local\Temp\ipykernel_8828\1714217578.py:1: RuntimeWarning: overflow encountered in short_scalars
y y
Out[323]: -1536
sum將它們提升為更大的 int,并且沒有警告:
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
我不記得細節,但有人解釋說檢查陣列的每個元素是否溢位是/被認為太昂貴了。
與其“手動”檢查,不如注意溢位的可能性,不要不必要地使用較小的 dtype。
可能的重復
正數之和導致負數
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/479465.html
