【问题标题】:fast iteration over two numpy arrays对两个 numpy 数组进行快速迭代
【发布时间】:2018-08-03 13:16:29
【问题描述】:

我正在尝试两个在python中实现以下问题

我有两个 1D numpy 数组,其中包含从 0 到 gridsize-1 的索引(称为 i1,i2)。 我还有一个带有数据的一维 numpy 数组(称为 d)。 所有三个数组的长度相同。

具有索引的数组可以包含特定的索引对(称为 s1,s2) 多次。

我现在想要两个将数据数组映射到 2D 数组(称为 arr)以便绘制它。 对于那些出现多次的索引对,我想取这些索引对应的数据条目的平均值。

我尝试了以下代码(没有平均)

d #data array
i1 #first 1D numpy index array
i2 #second 1D numpy index array
gridsize = 1000
arr = np.zeros(gridsize**2)
for i in range(d.size):
    arr[ i1[i], i2[i] ] = d[i]

到目前为止,代码运行良好,但速度很慢(数组大小大约需要 2 秒,这是不可接受的) 有什么建议可以加快速度吗? 我认为问题在于对数组中各个元素的访问。是否有内置的 numpy 函数可以做到这一点?

谢谢, 迈克尔

【问题讨论】:

  • 请在您的代码中正确地重新定义变量。您的代码中没有d 那么d.size 应该是什么意思?你写的代码到目前为止是有效的。然后请发布最小的工作代码。你在 for 循环中的索引也是错误的
  • 我编辑了代码。如果定义了数组 d、i1、i2,这是最小的工作示例。我认为这种索引 [a,b] 比使用 [a][b] 索引提取单个元素要快
  • 我的意思是发布需要 2s 的最小完整工作代码。编辑后的代码不好。 di1i2 都是未定义的。此外,arr 是一个形状为(1000000,) 的数组。在for 循环内,您将获得IndexError: too many indices for array

标签: python python-3.x numpy


【解决方案1】:

我将假设您的问题中不完全清楚的一些事情。

  • arr 是二维形状:(gridsize, gridsize)
  • i1 i2d 都是一维的,长度相同

鉴于这些条件,您可以相当直接地使用 numpy 的 integer array indexing 使用 i1i2 直接切片 arr 并将 d 分配给切片:

d #data array
i1 #first 1D numpy index array
i2 #second 1D numpy index array
gridsize = 1000
arr = np.zeros((gridsize,gridsize))
arr[i1,i2] = d

【讨论】:

  • @Bazingaa 这就是为什么定义d 是一维的假设的原因
  • 是的,它奏效了。回答这些你/我们必须做作业的问题真的很烦人
  • 我承认,如果您还不是 numpy ninja,找到合适的 google 关键字来遇到“numpy 整数数组索引”可能会有点困难。
  • 大多数时候只要谷歌搜索错误信息就足够了。
猜你喜欢
  • 2019-01-30
  • 2015-01-17
  • 2015-12-12
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 1970-01-01
  • 2011-10-03
相关资源
最近更新 更多