2013-03-31 32 views
1

我想將數據從一個3D陣列在其中一個條件爲真對不同的二維數組索引複製到其他3D陣列。所有三個陣列都具有相同的第一個二維形狀(x,y座標)。複製數據的3D numpy的陣列之間如果條件爲真

我覺得這一定是這樣的,

a[c == cond] = b[c == cond] 

但在這種情況下,它造成損壞/亂碼數據檢查時。這是否是錯誤的方式去解決這個問題,或者這是正確的方法,並且我的代碼在其他地方存在問題?

謝謝!

+0

你的數組索引那裏將評估爲'FALSE'或TRUE;,其分別等效於0或1,每一次。 – Cairnarvon

+0

@Cairnarvon的OP使用numpy的,所以爲'c == cond'仍然是一個[布爾的陣列(http://docs.scipy.org/doc/numpy/user/basics.indexing.html#boolean-or -mask索引陣列)。 @Newmu,你能檢查一下這條線是否會破壞你的數據?這就像添加一些打印語句或啓動pdb並設置斷點一樣簡單...... – jorgeca

+0

是的,打印語句發現問題,衝突的dtypes。 – Newmu

回答

1

如果陣列具有相同的形狀完全相同,那麼你可以做

import numpy as np 
a = np.random.rand(4,5,3) 
b = np.random.rand(4,5,3) 
c = np.random.rand(4,5,3) 
cond = c > 0.5 # for example 
b[cond] = a[cond] 

然而,如果形狀不同,在過去軸,那麼你需要解釋一下你希望發生什麼。

2

如果你是一個新的numpy的版本,使用np.copyto

0

道歉,我被複制到陣列中有不同的D型細胞和它鑄造於陣列的D型,而不是將其轉換爲原來的D型的。通過使用與源數組相同的dtype初始化該數組來修復該問題。

+0

你有更多的自由來處理與'np.copyto'這個問題,讓[幾種不同的選擇重鑄類型(http://docs.scipy.org/doc/numpy/reference/generated/numpy.copyto。 html):'cast:{'no','equiv','safe','same_kind','unsafe'},可選' – askewchan

+0

np.copyto在這種情況下並不實際工作,因爲掩碼是在2d數組上進行求值的而副本是在具有相同的前2維的3d陣列之間。有關廣播錯誤的信息。它可以工作,如果我在製作2D面具3d之前做了一個dstack,但這有點難看。 不錯,要記住前進的道路。謝謝! – Newmu

+0

您可以嘗試'np.copyto(b,a,where = cond [...,None])',它將一個空軸添加到大小爲1的'cond',所以第三維將廣播給所有「a」和「b」的第三個維度的值 – askewchan