Извлечение элементов из нескольких массивов в 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()
,