Есть ли более эффективный способ заменить эти 2 цикла for матричным умножением?
def cost_func(x, y):
for i in range(24):
for j in range(24):
cost = np.sum(W[i][j]*(y[j] - x[i]))
return cost
W — матрица (25,25), а x, y — векторы с 25 элементами.
numpy поддерживает оператор умножения матриц @. Я думаю, что вы можете получить то, что вы хотите:
C:\tmp>python
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> x = np.arange(3).reshape(1,3)
>>> y = np.arange(4)
>>> W = np.ones((3,4))
>>> (-x)@W@y
array([-18.])
>>>
ОП также упомянул W
в формуле
Да, его W
мой z
. Я изменю это.
На самом деле я не уверен, что y
и x
являются векторами, поскольку OP использовал np.sum
для кажущихся скалярными значений. Также я думаю, что ваш ответ эквивалентен sum(-wij*xi*yj)
?
Не уверен на 100%, чего вы пытаетесь достичь здесь, поскольку, как отметил @Tim Roberts, вы не экономите на расходах. Также np.sum
сбивает с толку, предполагая, что x
и y
являются одномерными векторами. Но если это 1d-векторы, вы можете сделать:
import numpy as np
x = np.arange(24)
y = np.arange(24)
W = np.random.uniform(0, 1, (24, 24))
cost = (W * (y.reshape(1, -1) - x.reshape(-1, 1)))
# cost[i][j] = W[i][j]*(y[j] - x[i])
Это не может быть правильный код. Вы вычисляете
cost
576 раз, а затем отбрасываете все, кроме последнего.