Применить операцию ко всем элементам в матрице, пропуская numpy.nanPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Применить операцию ко всем элементам в матрице, пропуская numpy.nan

Сообщение Anonymous »

У меня есть массив, заполненный данными только в нижних треугольниках, остальное — np.nan. Я хочу выполнить некоторые операции над этой матрицей, точнее — с элементами данных, а не nans, потому что я ожидаю, что поведение, когда элементы nans пропускаются в векторизованной операции, будет намного быстрее.
Я иметь два тестовых массива:

Код: Выделить всё

arr = np.array([
[1.111, 2.222, 3.333, 4.444, 5.555],
[6.666, 7.777, 8.888, 9.999, 10.10],
[11.11, 12.12, 13.13, 14.14, 15.15],
[16.16, 17.17, 18.18, 19.19, 20.20],
[21.21, 22.22, 23.23, 24.24, 25.25]
])

arr_nans = np.array([
[np.nan, np.nan, np.nan, np.nan, np.nan],
[6.666, np.nan, np.nan, np.nan, np.nan],
[11.11, 12.12, np.nan, np.nan, np.nan],
[16.16, 17.17, 18.18, np.nan, np.nan],
[21.21, 22.22, 23.23, 24.24, np.nan]
])
Я проверяю их следующим образом:

Код: Выделить всё

test = timeit.timeit('arr * 5 / 2.123', globals=globals(), number=1000)
test_nans = timeit.timeit('arr_nans * 5 / 2.123', globals=globals(), number=1000)

masked_arr_nans = np.ma.array(arr_nans, mask=np.isnan(arr_nans))
test_masked_nans = timeit.timeit('masked_arr_nans * 5 / 2.123', globals=globals(), number=1000)

print(test)                 # 0.0017232997342944145s
print(test_nans)            # 0.0017070993781089783s
print(test_masked_nans)     # 0.052730199880898s
Я создал массив масок Masked_arr_nans и замаскировал все nans. Но этот путь намного медленнее первых двух. Я не понимаю почему.
Основной вопрос - какой самый быстрый способ работать с массивами типа arr_nans, содержащими много нанов, возможно, есть более быстрый подход, чем те, о которых я упоминал.
Боковой вопрос: почему маскированный массив работает намного медленнее?

Подробнее здесь: https://stackoverflow.com/questions/793 ... -numpy-nan
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»