Python: сравнить и вставить вектор с упорядоченным массивом - PullRequest
1 голос
/ 09 марта 2019

У меня есть пустой массив, строки которого упорядочены, и вектор. Мне нужно вставить этот вектор в массив, если значение вектора меньше, чем некоторые значения каждой строки массива. Кроме того, мне нужно получить индекс позиции. Могу ли я использовать векторную операцию вместо двух для циклов?

Например, i-я строка массива равна [1,3,5,6], а i-е значение вектора равно 4, результат равен ([1,3,4,5], 2). Вот пример кода.

import random
import numpy as np

random.seed(0)
num_query = 2
topk = 3

distance = np.Inf * np.ones((num_query, topk))

print(distance)

for iter in range(4):
    print('------------loop: {:d}------------'.format(iter))
    dist = np.random.randn(num_query) / (0.3 * (iter+1))
    dist = dist * np.sign(dist)
    rows, columns = distance.shape
    for row in range(rows):
        d = dist[row]
        if d > distance[row, columns - 1]:
            continue
        min_col = 0
        for column in range(columns-1, -1, -1):
            if distance[row, column] < d:
                min_col = column + 1
                break
        distance[row, min_col + 1:] = distance[row, min_col:-1]
        distance[row, min_col] = d
    print(dist)
    print(distance)
    print('+++++++++++++++++++++++++++++++')
print(distance)

Вывод:

[[inf inf inf]
 [inf inf inf]]
------------loop: 0------------
[3.60155727 0.0991411 ]
[[3.60155727        inf        inf]
 [0.0991411         inf        inf]]
+++++++++++++++++++++++++++++++
------------loop: 1------------
[1.4839764  1.99641269]
[[1.4839764  3.60155727        inf]
 [0.0991411  1.99641269        inf]]
+++++++++++++++++++++++++++++++
------------loop: 2------------
[2.44132044 0.19221564]
[[1.4839764  2.44132044 3.60155727]
 [0.0991411  0.19221564 1.99641269]]
+++++++++++++++++++++++++++++++
------------loop: 3------------
[0.29206705 1.17013653]
[[0.29206705 1.4839764  2.44132044]
 [0.0991411  0.19221564 1.17013653]]
+++++++++++++++++++++++++++++++
[[0.29206705 1.4839764  2.44132044]
 [0.0991411  0.19221564 1.17013653]]
...