Какой самый питонный способ реализовать dotProduct? - PullRequest
1 голос
/ 28 мая 2019

Я пытаюсь реализовать скалярное произведение в Python, используя массивы numpy. Пока код, который я использую, работает:

x = np.random.rand(5,5)
w = np.random.rand(5,1)
dot_product = np.zeros((5,1), dtype = np.dtype('O'))

for j in range(len(dot_product[:,0])):
     for i in range(len(dot_product[0,:])):
         sumt = 0
         for column in range(len(x[0,:])):
             temp_x = x[j,column]
             temp_plain = w[column,i]
             sumt += temp_x * temp_plain
         dot_product[j,i] = sumt

Однако мне интересно, есть ли более питонный способ сделать это.

Конечно, я знаю о существовании numpy.dot, которое будет вычислять точечный продукт, но я хочу реализовать его самостоятельно, потому что я работаю с зашифрованными данными, поэтому я не могу использовать обычное умножение и сложение .

Цель вопроса - узнать, как оптимизировать код, а не использовать существующую функцию.

Ответы [ 2 ]

1 голос
/ 28 мая 2019
def dot_prod(x,w):
   if not ( x.shape[1]==w.shape[0]):
       raise Exception( 'The number of columns of the first matrix  does not match the number of rows of the second matrix ')

   dot_product = np.zeros((x.shape[0], w.shape[1]), dtype=np.dtype('O'))
   for i1,a in enumerate(x):
      for i2,y in enumerate(w.T):
         dot_product[i1,i2]= np.sum(a*y)
   return dot_product

Выход:

>x = np.random.rand(5,3)
>w = np.random.rand(3,2)
>dot_prod(x,w)
array([[1.0216453677132162, 1.0520242959212602],
       [0.7139675035454871, 0.7616075739263084],
       [0.9126062852861008, 0.9864445729083398],
       [0.42673040494581216, 0.4203998986679549],
       [0.9638211885773351, 1.0142282080627387]], dtype=object)

>x.dot(w)
array([[1.02164537, 1.0520243 ],
       [0.7139675 , 0.76160757],
       [0.91260629, 0.98644457],
       [0.4267304 , 0.4203999 ],
       [0.96382119, 1.01422821]])


>x = np.random.rand(5,3)
>w = np.random.rand(2,2)
>dot_prod(x,w)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/home/alperen/Projects/tmp.py", line 8, in dot_prod
    raise Exception( 'The number of columns of the first matrix  does not match the number of rows of the second matrix ')
Exception: The number of columns of the first matrix  does not match the number of rows of the second matrix 
0 голосов
/ 28 мая 2019

Использовать вложенный список комп.

def vdot(a, b):
    return sum(a*b)

a = np.arange(25).reshape((5, 5))
b = np.arange(15).reshape((5, 3))

res = np.array([[vdot(a_row, b_col) for b_col in b.T] for a_row in a])

assert np.all(res == np.dot(a, b))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...