簡體   English   中英

Numpy數組減法:大數組的值不一致

[英]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指定緩沖區大小


  1. https://github.com/numpy/numpy/issues/6119
  2. https://github.com/numpy/numpy/issues/5241
  3. https://github.com/numpy/numpy/issues/4802
  4. https://github.com/numpy/numpy/issues/2705
  5. https://github.com/numpy/numpy/issues/1683

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM