У меня есть логический массив, который выглядит так:

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), чтобы вернуть массив, который заменит 1 в arr_a значениями из arr_b, для конечного результата, который выглядит следующим образом:

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

Есть ли такая функция?

2
P.V. 26 Июн 2019 в 19:09

3 ответа

Лучший ответ

Вы можете создать новый массив того же dtype, что и arra_b, сделать вид среза, используя 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]])
2
yatu 26 Июн 2019 в 16:18

Вы можете использовать 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)

0
mao95 26 Июн 2019 в 16:25

Если ваш 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)

Это работает, если предположить, что формы совпадают

1
Kamuish 26 Июн 2019 в 16:44