繁体   English   中英

使用“numpy.ndarray”更高效的点积

[英]More efficient dot-product with 'numpy.ndarray'

我的user_factorsitem_factorsnumpy.ndarray类型。 我想有效地计算一行user_factors和每行item_factors之间的点积,并将结果存储在numpy.ndarray 这就是我的做法:

import numpy as np

...

user_coordinates = user_factors[user_id]

scores = []

for i in range(len(item_factors)):
    item_coordinates = item_factors[i]
    score = sum(i[0] * i[1] for i in zip(user_coordinates, item_coordinates))
    scores.append(score)


np_scores = np.hstack(scores)

这是否可以更有效地完成(也许最后没有listnumpy.ndarray转换)?

A 的第 i 行和 B 的第 j_ 行之间的点积在 C_{ij} 中给出:

A=np.random.randint(10, size=(3,3))
B=np.random.randint(10, size=(3,3))
C=np.dot(A,B.T)

如果要计算 A 的特定行(例如第 2 行)与 B 的所有行之间的点积,则:

C = np.dot(A[1,:], B.T)

让我们假设一些数据

np.random.seed(0)
user_coordinates = np.random.randint(0, 10, (10,))
item_factors = np.random.randint(0, 10, (15, 10))

你的结果将是

>>> np_scores
array([220, 156, 133, 178, 205, 269, 164, 184,  98, 159, 103, 182, 194,
       157, 188])

您可以使用 numpy 在单行直线中实现相同的效果:

>>> item_factors.dot(user_coordinates)
array([220, 156, 133, 178, 205, 269, 164, 184,  98, 159, 103, 182, 194,
       157, 188])

numpy.dot的文档说:

  • 如果 a 是 ND 数组而 b 是一维数组,则它是 a 和 b 的最后一个轴上的和积。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM