[英]Numpy array subtraction: inconsistent values for large arrays
這是我今天遇到的一個問題:我試圖從(大)整個矩陣中減去矩陣的第一行。 作為測試,我使所有行都相等。 這是一個MWE:
import numpy as np
first = np.random.normal(size=10)
reference = np.repeat((first,), 10000, axis=0)
copy_a = np.copy(reference)
copy_a -= copy_a[0]
print np.all(copy_a == 0) # prints False
哦哇 - False
! 所以我嘗試了另一件事:
copy_b = np.copy(reference)
copy_b -= reference[0]
np.all(copy_b == 0) # prints True
檢查新的copy_a
數組,我發現copy_a[0:818]
都是零, copy_a[820:]
是原始值,而copy_a[819]
是部分操作的。
In [115]: copy_a[819]
Out[115]:
array([ 0. , 0. , 0.57704706, -0.22270692, -1.83793342,
0.58976187, -0.71014837, 1.80517635, -0.98758385, -0.65062774])
看起來在操作過程的中途, numpy
回去看了一下copy_a[0]
,發現它全是零,因此從數組的其余部分減去零。 我發現這很奇怪。 這是一個錯誤,還是預期的numpy
結果?
中綴運算符-=
修改數組到位,這意味着你是在自己的腳下拉地毯。 您看到的效果可能與結果的內部緩存有關(即首先“提交”發生在818行之后)。
解決方案是將subtrahend換成另一個數組:
copy_a -= copy_a[0].copy()
實際上已經多次向numpy存儲庫報告此問題(參見下文)。 它被認為是一個錯誤 ,但很難在不犧牲性能(復制輸入數組)的情況下修復,因為正確檢測兩個數組是否共享內存是困難的。
因此,現在,您最好只復制copy_a[0]
如@ Torben的答案中所述 。
問題的實質是你在迭代時修改數組。 它恰好在copy_a[819]
之前工作,因為8192(819×10 + 2)是numpy指定緩沖區的大小 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.