Сравните пустые массивы, чьи записи являются строками, и найдите расположение строк - PullRequest
0 голосов
/ 29 ноября 2018

У меня два пустых массива, чьи записи являются строками .Первый массив (array1) имеет форму ( m, n ), где m> 1 и n> 1.Второй массив (array2) имеет форму (p, ), где p - целое число больше 1. Записи в массиве 2 не повторяются (т.е. они уникальны) , тогда как массив1 может иметь несколькоэкземпляры одинаковых строк.

Я хочу заменить массив1 другим массивом такой же формы (как массив1), путем включения индексов (чисел) вместо строк .Эти индексы получены путем сравнения элементов массива1 с массивом2 .Каждая запись в array1 обязательно будет соответствовать некоторой записи в array2.

Здесь важна скорость , и я хочу найти самый быстрый способ сделать это.

Вот небольшой пример:

import numpy as np

array1 = np.asarray([['aa', 'cc', 'bb', 'aa', 'aa', 'bb'],
                   ['cc', 'bb', 'cc', 'bb', 'aa', 'aa'],
                   ['bb', 'cc', 'aa', 'aa', 'bb', 'cc']])

array2 = np.asarray(['aa', 'bb', 'cc'])

Вот как я сейчас подхожу к проблеме:

for k in range(array1.shape[0]):
    array1[k] = np.asarray([j for i in range(array1.shape[1]) for j in range(len(array2)) if array1[k,i]==array2[j]]) 

print array1

[['0' '2' '1' '0' '0' '1']
 ['2' '1' '2' '1' '0' '0']
 ['1' '2' '0' '0' '1' '2']]

Но, когда я работаю с массивом 1 с огромным количеством строк и столбцов, я обнаружил, что вышеупомянутый способ не очень быстрый.

Какой может быть более быстрый способ достижения желаемой цели?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Возможная альтернатива:

import numpy as np

array1 = np.asarray([['aa', 'cc', 'bb', 'aa', 'aa', 'bb'],
                     ['cc', 'bb', 'cc', 'bb', 'aa', 'aa'],
                     ['bb', 'cc', 'aa', 'aa', 'bb', 'cc']])

array2 = np.asarray(['aa', 'bb', 'cc'])

d = {v: k for k, v in enumerate(array2)}
result = np.vectorize(d.get)(array1)

print(result)

Выход

[[0 2 1 0 0 1]
 [2 1 2 1 0 0]
 [1 2 0 0 1 2]]
0 голосов
/ 29 ноября 2018

Со всеми записями из array2, представленными в array, мы можем использовать np.searchsorted -

sidx = array2.argsort()
out = sidx[np.searchsorted(array2,array1.ravel(),sorter=sidx).reshape(array1.shape)]

Если array2 уже отсортировано, мы можем пропустить argsort и соответствующий шаг индексации -

out = np.searchsorted(array2,array1.ravel()).reshape(array1.shape)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...