如何仅用另一个数组的值替换 numpy 数组的部分值?
How to replace only part of a numpy array's values with those of another array?
我正在尝试按照屏蔽广播的方式做一些事情,其中只广播某些值。
假设我有一个更大的数组 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
这与常规广播returns相同,即:
[[0 0 0 0]
[0 0 0 0]
[0 0 1 1]
[0 0 1 1]]
而不是我希望的
[[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]
也没有用,因为它会使数组变平,使广播不兼容。
是否有其他方法可以达到同样的效果?
当你有 -
bigger_array[2:4, 2:4] = masked_smaller_array[~masked_smaller_array.mask]
您只需要对等式的左侧进行索引,以便在那里也使用相同的遮罩。因此,解决它的一种方法是修复它,就像这样 -
# 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)
实际上可以使用 numpy.where
和你的面具作为条件,并在条件为真时用 smaller_array
填充它。顺便说一句,您可以为此目的使用 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)
然后你可以为你的变量赋值
我正在尝试按照屏蔽广播的方式做一些事情,其中只广播某些值。
假设我有一个更大的数组 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
这与常规广播returns相同,即:
[[0 0 0 0]
[0 0 0 0]
[0 0 1 1]
[0 0 1 1]]
而不是我希望的
[[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]
也没有用,因为它会使数组变平,使广播不兼容。
是否有其他方法可以达到同样的效果?
当你有 -
bigger_array[2:4, 2:4] = masked_smaller_array[~masked_smaller_array.mask]
您只需要对等式的左侧进行索引,以便在那里也使用相同的遮罩。因此,解决它的一种方法是修复它,就像这样 -
# 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)
实际上可以使用 numpy.where
和你的面具作为条件,并在条件为真时用 smaller_array
填充它。顺便说一句,您可以为此目的使用 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)
然后你可以为你的变量赋值