python - 如何仅用另一个数组的值替换 numpy 数组的部分值?

标签 python arrays numpy array-broadcasting

我正在尝试按照屏蔽广播的方式做一些事情,其中​​只广播某些值。

假设我有一个更大的数组 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]]

而不是我希望的

[[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]

sample 运行-

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)

关于python - 如何仅用另一个数组的值替换 numpy 数组的部分值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34375579/

相关文章:

python - 转换 python 列表以进行 mongodb 导入时出现问题

python 将度数转换为 x 的变化和 y 的变化

python - 重定向 sys.stdout 时 numpy savetxt 乱序

python - tensorflow 找到到真实点的最小距离

python - 在 C++ 中使用 MinGW 嵌入 python3.6 链接失败

java - 尝试将文件中的描述实现到游戏中

c++ - 通过 C++ 中的类传递二维数组

java - 从 int 到 String 的随机元素?

python - 用 numpy 支持覆盖字典

python - 从双指针(来自 CythonGSL)获取 numpy ndarray (查看,而不是复制)