python - 向量化连续 numpy 计算

标签 python performance numpy

我在 numpy 中有许多操作,我可以在循环中完美地执行这些操作,但我无法在一次 numpy 调用中对它们进行矢量化。

# data matrix
d = np.random.rand(1496, 1, 2)

# boolean matrix
r = np.random.rand(5, 1496, 1, 2) > 0.5

# result matrix
x = np.empty((5,))

# How can I avoid this loop?
for i in xrange(r.shape[0]):
  x[i] = d[r[i]].sum()

是否可以通过某种方式矢量化循环来加快速度?

最佳答案

@Psidom 方法的变体:

np.tensordot(d, r, axes=((0,1,2), (1,2,3)))

这依赖于 tensordot 函数。来自其documentation :

Given two tensors (arrays of dimension greater than or equal to one), a and b, and an array_like object containing two array_like objects, (a_axes, b_axes), sum the products of a's and b's elements (components) over the axes specified by a_axes and b_axes.

从根本上来说,tensordot 计算两个数组的乘积(就像@Psidom 所做的那样)并计算乘积数组的所有元素的总和。与 @Psidom 的方法相比,此方法的唯一“优点”是,它可以更灵活地指定在两个数组中执行乘积和求和的轴。。与 @Psidom 的方法相比,它并没有提供更高的性能。

另请参阅Understanding tensordot .

关于python - 向量化连续 numpy 计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45003090/

相关文章:

python - 匹配条件后如何更新/替换嵌套循环内的列表项?

python - Pandas 中的空数据框

python - 求 c 使得 sum(x+c) over positives = K

python - Tkinter simpledialog 框在使用 Python3 的 Windows 10 中没有获得焦点

python - 如何在 Python 中获取 %APPDATA% 目录的路径?

javascript - 从移动内存中删除JS文件

python - 如何检查我使用的是哪个版本的 NumPy?

python - 向数组添加向量

C++ std::map 或 std::set - 有效地插入重复项

java - 是否可以在 Tomcat 8 中禁用对 JSP 2.3 引用静态字段和方法的支持