python - 快速 numpy 花式索引

标签 python numpy indexing slice

我用于切片 numpy 数组(通过花式索引)的代码非常慢。目前是程序瓶颈。

a.shape
(3218, 6)

ts = time.time(); a[rows][:, cols]; te = time.time(); print('%.8f' % (te-ts));
0.00200009

获取由矩阵 a 的行“rows”和列“col”的子集组成的数组的正确 numpy 调用是什么? (其实我需要这个结果的转置)

最佳答案

让我尝试总结 Jaime 和 TheodrosZelleke 的出色答案并加入一些评论。

  1. Advanced (fancy) indexing总是返回副本,从不返回 View 。
  2. a[rows][:,cols] 意味着 两个 奇特的索引操作,因此创建了一个中间副本 a[rows] 并丢弃。方便易读,但效率不高。此外请注意,[:,cols] 通常会从 C-cont 生成 Fortran 连续副本。来源。
  3. a[rows.reshape(-1,1),cols] 是一个高级索引表达式,它基于 rows.reshape(-1,1)colsbroadcast达到预期结果的形状。
  4. 一个普遍的经验是在扁平数组中建立索引比花式索引更有效,所以另一种方法是

    indx = rows.reshape(-1,1)*a.shape[1] + cols
    a.take(indx)
    

    a.take(indx.flat).reshape(rows.size,cols.size)
    
  5. 效率将取决于内存访问模式以及起始数组是 C 数还是 Fortran 连续数组,因此需要进行实验。

  6. 只有在真正需要时才使用花哨的索引:basic slicing a[rstart:rstop:rstep, cstart:cstop:cstep] 返回一个 View (虽然不是连续的)并且应该更快!

关于python - 快速 numpy 花式索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14386822/

相关文章:

python - 使用 python reshape 数组

mysql - 为什么索引使用取决于列类型

python - 排列 3d 数组 "slices"中的行以相互匹配

python - 使用 numpy 数组高效索引 numpy 数组

python - PyDev:chaco.shell 导入

python - numpy中的一维逆离散傅里叶变换是如何计算的?

mysql - SQL查询不使用索引

c - 打印可变参数函数中的数组索引

python - 寻求有关如何在 Python 中防止无休止的 "NameErrors"的一般建议

python - 理解 Python 中的 for 循环