Индексирование массивов между двумя массивами - PullRequest
0 голосов
/ 13 января 2020

enter image description here

У меня есть массив numpy и соответствующие значения поиска. Из каждого столбца данных я должен получить максимальную позицию соответствующего поиска и преобразовать эту позицию в результат данных.

Я должен сделать, как показано на рисунке.

Изображение говорит лучше, чем мой язык.

import numpy as np

data = np.array([[0, 2, 1, 4, 3, 2, 4, 4, 1],
                 [1, 1, 2, 0, 3, 4, 4, 2, 1],
                 [2, 2, 1, 4, 4, 1, 4, 4, 4]] )

print (data)

print ()

lookup = np.array([[60, 90, 90, 60, 50],
                  [90, 90, 80, 90, 90],
                  [60, 40, 90, 60, 50]])

print (lookup)

print ()

Я сделал следующее:

data = data.transpose(1,0)

lookup = lookup.transpose(1,0)

results = []       
for d in data:   
   matches = lookup[d].diagonal()
   print (matches)
   idx = np.argmax(matches, axis=0)
   res = d[idx]
   results.append(res)

print ()

print (results)  

Это сработало. Но есть ли лучший способ сделать это?

Ответы [ 3 ]

1 голос
/ 13 января 2020

Вы можете использовать факт выравнивания:

l = lookup.shape[1]
data1 = (data + [[0],[l], [2*l]]).copy()
matches = lookup.flatten()[data1.flatten()].reshape(data1.shape).T
results = data.T[:, np.argmax(matches, axis = 1)].diagonal()
print(matches)
print(results)

Выход

[[60 90 90]
 [90 90 90]
 [90 80 40]
 [50 90 50]
 [60 90 50]
 [90 90 40]
 [50 90 50]
 [50 80 50]
 [90 90 50]]  # matches

[1 2 1 0 3 2 4 2 1]  #results
0 голосов
/ 13 января 2020

Используйте необычную индексацию numpy . С его помощью вы можете предоставить массивы индексов. Смотрите пример:

data = np.arange(20)
data[[0, 1, 5, 10]]    # array([ 0,  1,  5, 10])

Массивы, используемые для индексации, также транслируются. Смотрите пример:

data = np.arange(20).reshape(5, 4)
i = np.array([0, 4])
j = np.array([0, 3])
data[i, j]                                 # array([ 0, 19])
i, j = i[:, np.newaxis], j[np.newaxis, :]
data[i, j]                                 # array([[ 0,  3], [16, 19]])

В вашем случае, matches таков, что matches[i, j] = lookup[i, data[i, j]]. Используя причудливую индексацию, мы делаем:

i = np.arange(data.shape[-2])[:, np.newaxis]
matches = lookup[i, data]

И конечный результат должен быть result[j] = data[i_max[j], j], с i_max[j] = argmax_i(matches[i, j]), что означает:

i_max = np.argmax(matches, axis=-2)
j = np.arange(data.shape[-1])
result = data[i_max, j]
0 голосов
/ 13 января 2020

Я не уверен, что понимаю вас, но, возможно, это то, что вы ищете?

data = data.T
lookup = lookup.T
cols = np.zeros_like(data) + np.array([0, 1, 2])
idx = np.argmax(lookup[data, cols], axis=1)
data[np.arange(data.shape[0]), idx]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...