python - Numpy 2D 点运算、索引和迭代。如何优化?

标签 python optimization numpy

我需要从代码中消除这个瓶颈。希望有人能帮助我。

我有以下迭代(摘自 nn 反距离插值算法):

jinterpol=0
for w, ix in zip(wds, ixs):
        wz = np.vdot(w, z[ix])
        result[jinterpol] = wz
        jinterpol += 1

我尝试删除 for 循环:

result = np.dot(wds, z[ixs])

但当然它说 ValueError: 对象未对齐

你能给我一些建议吗?非常感谢。

形状是:

  • wds:(550800, 8)
  • z:(212065,)
  • z[ixs]: (550800, 8)
  • ix:(550800, 8)

  • len(zip(距离, ixs)): 550800
  • w:(8,)
  • ix: (8,)

最佳答案

您可以使用np.einsum :

>>> import numpy as np
>>> wds = np.random.rand(550800, 8)
>>> z = np.random.rand(212065)
>>> ixs = np.random.randint(212065, size=(550800, 8))

>>> np.einsum('ij,ij->i', wds, z[ixs])
array([ 1.65069924,  3.26203701,  3.16035664, ...,  1.76963986,
        2.09727537,  1.94905991])

>>> np.vdot(wds[0], z[ixs[0]])
1.6506992361953157
>>> np.vdot(wds[1], z[ixs[1]])
3.2620370116548827

关于python - Numpy 2D 点运算、索引和迭代。如何优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24048965/

相关文章:

python - 如果我在运行时才知道文件名,如何从文件导入?

c++ - 自动矢量化不起作用

sql - Firebird 中选择查询的性能问题

python - 为什么 numpy 中 float128 低于最大值的数字被视为 inf?

Python:如何导入没有 python-filename 作为子模块的模块?

python - 如何在python中的一行数据中构造多行日志数据?

python - 制作一个矩阵正方形并在 numpy 中用所需的值填充它

python - 让 NumPy 在逻辑索引后返回正确形状的数组而不进行 reshape 的简洁方法?

python - Jupyter notebook 不连接内核(2) - conda + mc os 11.5 + appnope

java - 将数千行插入 mysql 数据库的最快方法?