Как заменить массив numpy другим массивом numpy с другими измерениями? - PullRequest
0 голосов
/ 09 февраля 2020

У меня небольшая проблема numpy, когда я пытаюсь заменить значения из A значениями B. См. MWE:

t = np.arange(65,70,2)
>>array([65, 67, 69])

b = np.random.randint(3,size=20)
>>array([2, 2, 1, 2, 1, 2, 2, 1, 1, 0, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2])

Теперь b должно быть замаскировано t, поэтому что 2 соответствуют третьему элементу t, а 0 - первому элементу t.

Какой самый эффективный способ сделать это с numpy?

Ответы [ 2 ]

1 голос
/ 09 февраля 2020

Для этого вы можете использовать понимание списка:

[t[b_elem] for b_elem in b]
0 голосов
/ 09 февраля 2020

Путь 1

Для простого использования вы можете просто заменить элементы b следующим образом:

for i in range(3):
    b[b==i] = t[i]

Это довольно справедливо, но не эффективно, особенно если вы играете с огромным диапазоном индексов.

Способ 2

Если вы хотите оптимизировать его, вам нужно использовать группировку, как я обсуждал в этом посте . Заимствование из ответа Дивакара, numpy - единственное решение требует более глубокого понимания:

b = np.array([2, 2, 1, 2, 1, 2, 2, 1, 1, 0, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2])
sidx = np.argsort(b) #indices that would sort an array
bs = b[sidx] #sorted array
# locations of changings in sorted array, [ 0,  3,  7, 20] in this case:
split_idx = np.flatnonzero(np.r_[True,bs[:-1]!=bs[1:],True])
indices = [sidx[i:j] for (i,j) in zip(split_idx[:-1], split_idx[1:])]

Индексы - это список массивов [ 9, 17, 15], [2, 4, 7, 8], [16, 14, 13, 12, 0, 10, 18, 6, 5, 3, 1, 11, 19], который эквивалентно b==0, b==1, b==2, поэтому вы можете использовать их сейчас так:

for i in range(len(indices)):
    b[indices[i]] = t[i]

Путь 3

Это наиболее эффективный способ, который я нашел, но numpy здесь недостаточно:

import pandas as pd
indices = pd.DataFrame(b).groupby([0]).indices.values()
for i in range(len(indices)):
    b[indices[i]] = t[i]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...