如何使用NumPy布尔数组来修改另一个NumPy数组?

3

我有一个布尔型数组,长这样:

arr_a = np.array(
[[False, False, False],
[True, True, True],
[True, True, True],
[False, False, False]]
)

还有一个长这样的数组:

arr_b = np.array(
[[100, 100, 100],
[200, 200, 200]]
)

我正在寻找一个可以这样调用的函数:np.boolean_combine(arr_a, arr_b),用来返回一个数组,该数组将替换arr_a中的1为arr_b的值,得到以下结果:
np.array(
[[0, 0, 0]
[100, 100, 100],
[200, 200, 200],
[0, 0, 0]]
)

有这样的功能吗?


形状总是匹配的吗?那么 arra_b.size 是否总是等于 arr_aTrue 的数量? - user3483203
是的,这些形状将始终匹配。 - Preethi Vaidyanathan
3个回答

2
你可以创建一个与arra_b相同dtype的新数组,使用arr_a创建一个切片视图,并将arra_b中的值赋值给它:最初的回答
out = arr_a.astype(arra_b.dtype)
out[arr_a] = arra_b.ravel()

array([[  0,   0,   0],
       [100, 100, 100],
       [200, 200, 200],
       [  0,   0,   0]])

1
如果您的 arr_a 是由 1 和 0 组成的:
import numpy as np 
arr_a = np.array(
[[0, 0, 0],
[1, 1, 1],
[1, 1, 1],
[0, 0, 0]])
arra_b = np.array(

[[100, 100, 100],

[200, 200, 200]])


arr_a[np.where(arr_a)]  = arra_b.reshape(arr_a[np.where(arr_a)].shape)

假设形状匹配,这个会起作用。


这是返回的内容:
arr_a = np.array([[0, 0, 0], [1, 1, 1], [0, 0, 0]]) arra_b = np.array([[100, 100, 100],[200, 200, 200]]) arr_a[np.where(arr_a)] = arra_b.reshape(arr_a[np.where(arr_a)].shape) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: 无法将大小为6的数组重新塑造为形状(3,)
- Preethi Vaidyanathan
我刚刚再次运行它,没有出现错误。请检查我的答案编辑,看看我的数组a和b是否与你的相等。 - Kamuish

0

你可以使用 zip()。假设 arr_a 和 arr_b(显然,根据你的问题)具有相同的维度:

def boolean_combine(arr_a, arr_b) -> np.array:
  combined = []
  for row_a, row_b in zip(arr_a, arr_b):
    row_combined = []
    for a, b in zip(row_a, row_b):
      if a == 'True':
        row_combined.append(b)
      else:
        row_combined.append(a)
    combined.append(np.asarray(row_combined))
  return np.asarray(combined)

然后,在你的主函数中,只需键入combined = boolean_combine(arr_a, arr_b)即可调用此函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接