Я хотел бы уменьшить многомерный массив вдоль одной оси, найдя значение first в других диапазонах, которое является правдивым/соответствует некоторому условию, или значение по умолчанию, если не удается найти соответствующие элементы . Пока что я пытаюсь сделать это для трехмерного массива с помощью простого цикла следующим образом:
def first(arr, condition, default):
out = default.copy()
for u in range(arr.shape[1]):
for e in range(arr.shape[2]):
(idx,) = np.nonzero(condition[:, u, e])
if len(idx):
out[u, e] = arr[idx[0], u, e]
return out
Однако это немного некрасиво, неэффективно, не векторизовано и нелегко обобщается на массивы произвольных размеров. Есть ли у numpy более удобный встроенный способ добиться этого?
РЕДАКТИРОВАТЬ:
Вот пример:
test_arr = np.array(
[
[np.nan, 1, 2, 3, 4, np.nan, 6, 7, 8, 9],
[np.nan, np.nan, 3, 4, 5, 6, 7, 8, 9, np.nan],
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
np.full((10,), np.nan),
]
)
test_default = np.array([5, 5, 5, 5])
test_cond = ~np.isnan(test_arr)
Ожидаемый результат:
first(test_arr, test_cond, test_default)
# outputs [1.0, 3.0, 2.0, 5.0]
Подробнее здесь: https://stackoverflow.com/questions/790 ... r-argfirst