我用于切片 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 的出色答案并加入一些评论。
- Advanced (fancy) indexing总是返回副本,从不返回 View 。
a[rows][:,cols]
意味着 两个 奇特的索引操作,因此创建了一个中间副本a[rows]
并丢弃。方便易读,但效率不高。此外请注意,[:,cols]
通常会从 C-cont 生成 Fortran 连续副本。来源。a[rows.reshape(-1,1),cols]
是一个高级索引表达式,它基于rows.reshape(-1,1)
和cols
是 broadcast达到预期结果的形状。一个普遍的经验是在扁平数组中建立索引比花式索引更有效,所以另一种方法是
indx = rows.reshape(-1,1)*a.shape[1] + cols a.take(indx)
或
a.take(indx.flat).reshape(rows.size,cols.size)
效率将取决于内存访问模式以及起始数组是 C 数还是 Fortran 连续数组,因此需要进行实验。
只有在真正需要时才使用花哨的索引:basic slicing
a[rstart:rstop:rstep, cstart:cstop:cstep]
返回一个 View (虽然不是连续的)并且应该更快!
关于python - 快速 numpy 花式索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14386822/