У меня есть пустой массив, строки которого упорядочены, и вектор. Мне нужно вставить этот вектор в массив, если значение вектора меньше, чем некоторые значения каждой строки массива. Кроме того, мне нужно получить индекс позиции. Могу ли я использовать векторную операцию вместо двух для циклов?
Например, 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]]