Можно ли избежать этого l oop, используя numpy? - PullRequest
1 голос
/ 28 мая 2020

Предположим, у вас есть две numpy матрицы:

import numpy as np

n = 800
m = 16
A = np.zeros((n, 4)) #np.random.rand(n,4) if you wish
B = np.zeros(m)      #np.random.rand(m) if you wish

В моем коде мне нужно вычесть каждое значение, найденное в B, из всех значений A, затем вычислить этот квадрат и получить индекс, который дает мне минимум этой новой матрицы. Следовательно, у меня будет m минимумов. Из них мне нужен минимум. Для этого сейчас я использую al oop, например:

min_C = np.zeros(m)

for j in range(m):
    C = A[:,2]-B[j]
    C = C*C
    min_C[j] = np.where(C == np.amin(C))[0][0]

Итак, у меня есть минимум для каждого j. Затем я делаю минимум min_ C. Могу ли я избежать этого l oop, чтобы получить абсолютный минимум? Я не могу сейчас представить, как это кодировать, если возможно. Это просто для повышения эффективности моего кода, который мне нужен, поскольку этот расчет, конечно же, выполняется много раз с разными A и B.

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Я предполагаю, что фиксированный индекс 2, который появляется в вашем примере кода, останется фиксированным, что сводит проблему к случаю, когда A является одномерным. Если я правильно понимаю вопрос и смотрю на результат вашей выборки, вы ищете индекс, а не значение, появляющееся в одном из C, так что мы можем заменить квадрат абсолютным значением. Сначала мы создаем это абсолютное значение всех комбинаций A [i, 2] и B [j] с помощью подсказки @yatu, а затем вычисляем минимум argmins вдоль второй оси (размером n)

c = np.abs(A[:,2]-B[:,None])
answer = np.min(np.argmin(c, axis=1))

Надеюсь, я правильно понял то, о чем вы просили, если фиксированный индекс A должен быть изменен, расширьте широковещание:

c = np.abs(A[:,:]-B[:,None,None])
answer = np.min(np.argmin(c, axis=1))

Результатом будет int, который отличается из вашего образца кода.

1 голос
/ 28 мая 2020

Используя широковещательную передачу , вы можете уменьшить это до следующего, взяв min полученного массива (m,n):

((A[:,2]-B[:,None])**2).min()
...