2015-12-19 85 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) 

然后,你可以指定,对于您的变量

相关问题