Python: пошаговое булево индексирование / маскирование - PullRequest
0 голосов
/ 24 марта 2020

Я относительно новичок в Python и пытаюсь найти способ Pythoni c, чтобы сделать следующее:

У меня относительно большой четырехмерный массив (1000 x 1000 x 5 x 9) в наименьшем случае). Из каждой матрицы 1000 x 1000 (с постоянным значением dim 3 и 4) я хочу извлечь первые n элементов каждого столбца. Но n изменяется от столбца к столбцу способом, который напоминает пошаговую функцию.

Следовательно, я хочу, например, логическую маску, которая выглядит как следующая матрица:

0 1 1 1 1
0 0 1 1 1
0 0 0 0 1
0 0 0 0 0

Тем не менее я прочитал, что индексирование должно выполняться быстрее, чем логическое маскирование. Поэтому мой текущий подход использует много циклов for:

def getElements(index,L):
"""
index - a (T x T x K x A)-array, smallest case is T = 1,000, K = 5, A = 9,
goes up to T = 50,000, K = 20, A = 10
L - a list used to compute the fraction of column elements extracted, containing 
numbers from 1 to ~10
"""

T = index.shape[0]
K = index.shape[2]
A = index.shape[3]
dimL = max(L)

elem = np.empty((T,T,K*dimL,A))
elem[:] = np.nan

m = -1

for kk in range(K):
    for ll in L:
        m +=1
        p = ll/(dimL+1)
        for aa in range(A):
            for tt in range(T):
                n = min(math.floor(tt*p),T-kk) # Floor function leads to stepwise mask/ indexing
                elem[:n, tt, m, aa] = index[:n, tt, kk, aa]
            elem[:, :, m, aa] += (kk+1)
return elem

Существует ли эффективный и pythoni c способ решить эту проблему?

Большое спасибо!

РЕДАКТИРОВАТЬ: Вот (надеюсь, минимальный) воспроизводимый пример:

index = np.arange(100000)
index = np.reshape(index,(100,100,10))

T = index.shape[0]
K = index.shape[2]
L = 2

elem = np.full((T,T,K*L), np.nan)

m = -1

for kk in range(K):
  for ll in range(L):
    m +=1
    p = (ll+1)/(L+1)
    for tt in range(T):
        n = min(math.floor((tt+1)*p),T-kk) # tt+1 as python counts from zero
        elem[:n, tt, m] = index[:n, tt, kk] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...