看起来索引带有索引数组的numpy记录数组的速度非常慢。但是,可以使用np.view
10-15倍的速度执行相同的操作。
这种差异背后有原因吗?为什么不以更快的方式实现记录数组的索引? (另见sorting numpy structured and record arrays is very slow)
mydtype = np.dtype("i4,i8")
mydtype.names = ("foo","bar")
N = 100000
foobar = np.zeros(N,dtype = mydtype)
foobar["foo"] = np.random.randint(0,100,N)
foobar["bar"] = np.random.randint(0,10000,N)
b = np.lexsort((foobar["foo"],foobar["bar"]))
timeit foobar[b]
100 loops, best of 3: 11.2 ms per loop
timeit foobar.view("|S12")[b].view(mydtype)
1000 loops, best of 3: 882 µs per loop
显然,两个结果都给出了相同的答案。
答案 0 :(得分:3)
take
甚至比双视图方法更快:
np.take(foobar,b)
实际上它和
一样快foobar['foo'][b]
如果你想深入挖掘源代码,https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/item_selection.c是一个起点。
我的猜测是__getitem__
的实施方式会导致这种差异。也许作为早期记录处理的残余,当dtype
混合时(以及高级索引),它会采用不同的路径。
布尔掩码索引似乎不受此减速的影响。基本切片索引也是如此。