Вычисляйте массив numpy только по определенным индексам, заданным маскойPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Вычисляйте массив numpy только по определенным индексам, заданным маской

Сообщение Anonymous »

Внутри большого проекта мне нужно было определенным образом обработать 2D-массив. Первоначально я реализовал его с использованием четырехвложенного цикла for с тестом if, который проверяет, выполняется ли условие для заданных индексов. Ничего не должно произойти, если if-тест имеет значение False. Вот минимальный воспроизводимый пример:

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

import numpy as np

L=8; K=20
data = np.random.randint(-10,10,(L,K)) + np.random.randint(-10,10,(L,K))*1j

check_pos = data > 0
check_neg_imag = np.imag(data) < 0

def for_looped(data,L,K,check_pos,check_neg_imag):
processed = np.zeros((L,K,L,K), dtype=complex)
for l in range(L):
for k in range(K):
for ll in range(L):
for kk in range(K):
if (check_pos[l,k] and check_neg_imag[ll,kk]) or (check_neg_imag[l,k] and check_pos[ll,kk]):
processed[l,k,ll,kk] = data[l,k] * data[ll,kk].conj()
return processed
processed = for_looped(data,L,K,check_pos,check_neg_imag)
По мере увеличения размеров данных это происходит довольно медленно, поэтому я попытался векторизовать циклы for. Однако у меня возникли проблемы с if-тестом. Я пробовал просто векторизовать без него:

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

def vectorized(data):
return data[:,:,None,None] * data[None,None,:,:].conj()
processed_vec = vectorized(data)
Это работает, но при этом тратится много вычислительного времени на вычисление значений, которые не используются. Я читал одно место, где np.where() можно использовать в сочетании с маской, например:

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

mask = (check_pos[:,:,None,None] & check_neg_imag[None,None,:,:]) | (check_neg_imag[:,:,None,None] & check_pos[None,None,:,:])
def vectorized_where(data,mask):
return np.where(mask, data[:,:,None,None] * data[None,None,:,:].conj(), 0)
processed_vec_where = vectorized_where(data,mask)
Однако я проверил время выполнения с помощью timeit, и код с np.where() на самом деле медленнее:

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

%timeit for_looped(data,L,K)
14.8 ms ± 44.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit vectorized(data)
45.5 µs ± 2.62 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

%timeit vectorized_where(data,mask)
65.9 µs ± 2.6 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
Я подозреваю, что происходит то, что np.where() вычисляет data[:,:,None,None] * data[None,None,:,:]. conj() для всех индексов, а затем заменяет те, где маска имеет значение True, на 0. Это также тратит время вычислений на то, для чего я его использую.
Есть ли способ вычислить только data[:,:,None,None] * data[None,None,:,:].conj() для индексов, заданных маской?

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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Установка многомерного массива numpy по определенным индексам, равным 1D-массиву
    Anonymous » » в форуме Python
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Init 1D массив numpy с логической маской и меньшим массивом, содержащим ненулевые значения
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Объединить 2 массива по определенным индексам в Javascript
    Гость » » в форуме Javascript
    0 Ответы
    35 Просмотры
    Последнее сообщение Гость
  • Объединить 2 массива по определенным индексам в Javascript
    Гость » » в форуме Javascript
    0 Ответы
    18 Просмотры
    Последнее сообщение Гость
  • Объединить 2 массива по определенным индексам в Javascript
    Anonymous » » в форуме Javascript
    0 Ответы
    25 Просмотры
    Последнее сообщение Anonymous

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