【问题标题】:Vectorizing a numpy array call of varying indices向量化不同索引的 numpy 数组调用
【发布时间】:2013-06-21 23:42:47
【问题描述】:

我有一个 2D numpy 数组和一个索引列表列表,我希望从 numpy 数组中计算相应的 1D 向量的总和。这可以通过 for 循环或列表理解轻松完成,但我想知道是否可以对其进行矢量化。使用类似的代码,我从矢量化中获得了大约 40 倍的加速。

这里是示例代码:

import numpy as np
indices = [[1,2],[1,3],[2,0,3],[1]]
array_2d = np.array([[0.5, 1.5],[1.5,2.5],[2.5,3.5],[3.5,4.5]])
soln = [np.sum(array_2d[x], axis=-1) for x in indices]

(编辑):请注意,对于 array_2d,索引不是 (x,y) 坐标,而是 indices[0] = [1,2] 表示 array_2d 中的第一个和第二个向量(行)。索引中每个列表的元素数量是可变的。

这是我希望能够做到的:

vectorized_soln = np.sum(array_2d[indices[:]], axis=-1)

有人知道是否有任何方法可以实现这一目标吗?

【问题讨论】:

  • indices 的最后一个元素应该是[2] 吗?其他元素的长度为 2。
  • 我编辑了这篇文章并解释了更多索引代表什么。最初是的,索引中的元素可以具有可变大小,但对 array_2d 中相应向量执行的操作应该同样有效(例如总和或平均值),并输出单个向量。

标签: python numpy vectorization


【解决方案1】:

首先,我认为您在索引的第三个元素中有错字...

最简单的方法是构建一个包含两个索引数组的 sub_array:

i = np.array([1,1,2])
j = np.array([2,3,?])
sub_arr2d = array_2d[i,j]

最后,你可以取 sub_arr2d 的总和...

【讨论】:

  • 这不是错字,我稍微编辑了帖子以更好地解释索引的含义。我认为您的建议与我的想法不符(希望现在写得更好)。
猜你喜欢
  • 2020-10-22
  • 2021-09-23
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 2011-08-12
  • 1970-01-01
  • 2021-04-29
相关资源
最近更新 更多