2015-12-19 87 views
2

我正在嘗試沿着一個屏蔽廣播的行,只有特定的值被廣播。如何用另一個數組的值替換一部分numpy數組的值?

假設我有一個更大的陣列,bigger_array,和一個較小的陣列,smaller_array:

import numpy as np 
import numpy.ma as ma 

bigger_array = np.zeros((4,4), dtype=np.int32) 
smaller_array = np.ones((2,2), dtype=np.int32) 

現在,我只希望較小陣列的前三個值,以取代那些更大的某部分的數組,但掩蔽沒有做什麼,我所願做:

masked_smaller_array = ma.masked_array(smaller_array, mask=[(0, 0), (0, 1)]) 
bigger_array[2:4, 2:4] = masked_smaller_array 

這只是返回一個常規的廣播會同樣的事情,即:

[[0 0 0 0] 
[0 0 0 0] 
[0 0 1 1] 
[0 0 1 1]] 
通過

bigger_array[2:4, 2:4] = masked_smaller_array[~masked_smaller_array.mask] 

覆蓋前

相反我希望

[[0 0 0 0] 
[0 0 0 0] 
[0 0 1 1] 
[0 0 1 0]] 

剔除的屏蔽值是沒有用的也爲拉平陣列製作廣播不兼容。

有沒有其他方法可以達到相同的效果?

bigger_array[2:4, 2:4] = masked_smaller_array[~masked_smaller_array.mask] 

你只是需要指數等式的左邊使用相同的面膜敷在有作爲 -

回答

1

當你有你接近。因此,爲了解決這個問題一個辦法是解決它,就像這樣 -

# Mask corresponding to smaller array from where elements are to be taken 
select_mask = ~masked_smaller_array.mask 

# Use the mask on source (smaller array) to select specific elements from it 
# and update sliced and masked (with same mask) places in bigger array 
bigger_array[2:4, 2:4][select_mask] = smaller_array[select_mask] 

採樣運行 -

In [59]: bigger_array = np.zeros((4,4), dtype=np.int32) 
    ...: smaller_array = np.ones((2,2), dtype=np.int32) 
    ...: masked_smaller_array =ma.masked_array(smaller_array,mask=[(0, 0),(0, 1)]) 
    ...: 

In [60]: select_mask = ~masked_smaller_array.mask 

In [61]: select_mask 
Out[61]: 
array([[ True, True], 
     [ True, False]], dtype=bool) 

In [62]: bigger_array[2:4, 2:4][select_mask] = smaller_array[select_mask] 

In [63]: bigger_array 
Out[63]: 
array([[0, 0, 0, 0], 
     [0, 0, 0, 0], 
     [0, 0, 1, 1], 
     [0, 0, 1, 0]], dtype=int32) 
0

其實可以用numpy.where與你的面具的條件,當條件是smaller_array填充真正。順便說一句IIUC你可以使用make_mask而不是masked_array用於這一目的:

your_mask = [(0, 0), (0, 1)] 
mask = ma.make_mask(your_mask) 
np.where(~mask, smaller_array, bigger_array[2:4, 2:4]) 


In [106]: mask 
Out[106]: 
array([[False, False], 
     [False, True]], dtype=bool) 

In [108]: np.where(~mask, smaller_array, bigger_array[2:4, 2:4]) 
Out[108]: 
array([[1, 1], 
     [1, 0]], dtype=int32) 

然後,你可以指定,對於您的變量

相關問題