Извлечение элементов из нескольких массивов в Numpy/Scipy

У меня есть три пустых массива: A, B и C. Я должен извлечь '1', который является общим (по пикселям) для любых двух из указанных массивов, и установить все остальные элементы как 0.

import numpy as np

A = np.array([[1,0,0,0,0],
               [1,0,0,0,0],
               [1,0,0,0,0]])              

B = np.array([[1,1,1,1,1],
               [1,1,1,1,1],
               [1,1,1,1,1]])

C = np.array([[0,0,0,0,1],
               [0,0,0,0,1],
               [0,0,0,0,1]])

Ожидаемый ответ будет:

result = np.array([[1,0,0,0,1],
               [1,0,0,0,1],
               [1,0,0,0,1]])

Как я могу сделать это, используя Numpy/Scipy? Требуется более высокая производительность, поскольку в моей реальной задаче число массивов составляет 50 с, а размер каждого массива - (3000, 3000), и я должен извлечь "1", если он общий для 30 массивов.

1 ответ

Решение

Суммируйте их и затем используйте логические операции, чтобы проверить, являются ли элементы >=2,

import numpy as np

A = np.array([[1,0,0,0,0],
               [1,0,0,0,0],
               [1,0,0,0,0]])              

B = np.array([[1,1,1,1,1],
               [1,1,1,1,1],
               [1,1,1,1,1]])

C = np.array([[0,0,0,0,1],
               [0,0,0,0,1],
               [0,0,0,0,1]])

D = A + B + C

D = (D >= 2).astype(int)

print(D)
#[[1 0 0 0 1]
# [1 0 0 0 1]
# [1 0 0 0 1]]

(D >= 2).astype(int) вернет True для каждого значения, которое >=2 и ложь в противном случае. Затем вы конвертируете его из значений True/False в значения 1/0, используя .astype(int),

Вы упоминаете в своем вопросе, что в вашем реальном случае вы можете иметь до 50 массивов? Либо сохраните их в списке и используйте sum() или сохранить их в 3-мерном массиве NumPy и использовать your_numpy_array.sum(),

Другие вопросы по тегам