Как использовать массив NumPy Boolean для изменения другого массива NUMPY? - PullRequest
1 голос
/ 26 июня 2019

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

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

Я ищу функцию, которую можно вызвать какthis: 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]]
)

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

Ответы [ 3 ]

2 голосов
/ 26 июня 2019

Вы можете создать новый массив того же 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]])
1 голос
/ 26 июня 2019

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

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

0 голосов
/ 26 июня 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...