【问题标题】:Indexing 1-D array using list of arrays with varying lengths使用不同长度的数组列表索引一维数组
【发布时间】:2019-12-19 19:01:59
【问题描述】:

我想做的例子:

import numpy as np

values = np.array([7, 7, 5, 2, 3, 9])
indices = np.array([
    np.array([3,5]), 
    np.array([4]),
    np.array([1,2,3])
    ])

>>> values[indices]
array([
    array([2,9]), 
    array([3]),
    array([7,5,2]),
    ])

是否可以使用矢量化来实现这一点? 现在我正在使用 for 循环执行此操作,但它可能会变慢。

谢谢!

【问题讨论】:

  • 通常indices 的长度是多少,每个数组中有多少个元素?
  • len(values) == len(indices)indices 中每个子数组的长度可以从 1len(values) 变化
  • 通常情况下,这些参数值是什么样的?根据您的实际用例了解数据集大小。
  • 数据集大小可以以百万计。
  • indices中数组的典型长度?

标签: python arrays numpy indexing slice


【解决方案1】:

我们可以连接索引,用这些索引到values,最后拆分回来 -

idx = np.concatenate(indices)
all_out = values[idx]
lens = list(map(len,indices))
ssidx = np.r_[0,lens].cumsum()
out = [all_out[i:j] for (i,j) in zip(ssidx[:-1],ssidx[1:])]

为了完整起见,这里是直接的基于索引的版本 -

[values[i] for i in indices]

因此,通过我们提出的方法,我们利用了切片,从而减少了每次迭代的工作量。因此,除了获得idx 的步骤(需要连接提议的索引中的所有索引)之外,这对于indices 中的小型索引数组的情况是有意义的。

【讨论】:

  • 酷!您的方法比我使用 for 循环时快 15 倍。谢谢你是一个救生员:)))
猜你喜欢
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
  • 2019-11-20
  • 2019-07-25
  • 2016-06-22
  • 1970-01-01
  • 2020-01-17
相关资源
最近更新 更多