2 回答

TA貢獻(xiàn)1735條經(jīng)驗 獲得超5個贊
當(dāng)您執(zhí)行代碼時,請注意警告:
RuntimeWarning: overflow encountered in long_scalars
total = total+j
這是因為numpy有時默認(rèn)為np.int32(取決于操作系統(tǒng)是 32/64 位并且安裝的 Python 解釋器是 32/64 位,顯然是其中較低的一個)。在這種情況下,大量數(shù)字會溢出,因此它們會換行為負(fù)數(shù)。
通過提供以下內(nèi)容可以輕松解決此問題dtype=np.int64:
a = np.array([2, 0, 0, 4, 0, 1, 0, 4, 5, 5], dtype=np.int64)
這可以通過添加以下內(nèi)容來確認(rèn):
from itertools import chain
print(len(list(filter(lambda n: n < 0, chain.from_iterable(arr)))))
這會展平arr并計算有多少個負(fù)數(shù)。使用原始代碼,輸出是
RuntimeWarning: overflow encountered in long_scalars
total = total+j
5
添加后dtype=np.int64輸出是
0

TA貢獻(xiàn)1825條經(jīng)驗 獲得超6個贊
NumPy 數(shù)組使用固定大小的整數(shù)類型(例如)?,這與大小不受限制的int64
常規(guī) Python 類型不同。int
它們具有可以代表的最大值。嘗試添加大于此最大值的值會導(dǎo)致溢出,這可能會導(dǎo)致有符號整數(shù)類型出現(xiàn)負(fù)值。
例如,該類型的最大值int32
為 2?31??1 = 2147483647,加 1 得到最小值 ?2?31?= ?2147483648。對于int64
類型來說,這些值要大得多;分別為9223372036854775807和-9223372036854775808。根據(jù)您的實現(xiàn)(即 NumPy 默認(rèn)使用的類型)和您使用的輸入,您可能會或可能不會看到此行為。
就您而言,與 Python 列表相比,您似乎沒有使用 NumPy 數(shù)組提供的任何功能,因此您可以只使用a = [2, 0, 0, 4, 0, 1, 0, 4, 5, 5]
并依賴 Python 為您處理無限的大整數(shù)。
添加回答
舉報