[英]Numpy: Is there an array size limit?
我正在學習使用Numpy,我想在數字列表的總和中看到速度差異所以我制作了這段代碼:
np_array = numpy.arange(1000000)
start = time.time()
sum_ = np_array.sum()
print time.time() - start, sum_
>>> 0.0 1783293664
python_list = range(1000000)
start = time.time()
sum_ = sum(python_list)
print time.time() - start, sum_
>>> 0.390000104904 499999500000
python_list總和是正確的。
如果我使用總和為1000的相同代碼,則兩者都打印正確的答案。 Numpy數組的長度是上限還是Numpy sum函數?
謝謝你的幫助
當數字大於32位int時,標准列表切換到使用long類型進行算術運算。
numpy數組沒有切換為long,並且遭遇整數溢出。 速度的價格是允許的較小值范圍。
>>> 499999500000 % 2**32
1783293664L
Numpy正在創建一個32位無符號整數的數組。 當它們相加時,它將它們相加為32位值。
if 499999500000L % (2**32) == 1783293664L:
print "Overflowed a 32-bit integer"
您可以在陣列創建時顯式選擇數據類型:
a = numpy.arange(1000000, dtype=numpy.uint64)
a.sum() -> 499999500000
請注意, 499999500000 % 2**32
完全等於1783293664 ...即,numpy正在進行模2 * 32的操作,因為這是你告訴它使用的numpy.array的類型。
例如,使np_array = numpy.arange(1000000, dtype=numpy.uint64)
,你的總和就會好(雖然當然還有限制,任何有限大小的數字類型)。
你可以使用dtype=numpy.object
告訴numpy該數組包含通用的Python對象; 當然,隨着普遍性的增加,表現會衰退。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.