到np.ix_
的替代方法是布尔数组整数数组转换结果(使用np.nonzero()
),然后使用np.newaxis
创建正确形状的阵列以利用广播。
import numpy as np
a=np.random.rand(10,20)
x_range=np.arange(10)
y_range=np.arange(20)
a_tmp=a[x_range<5,:]
b_correct=a_tmp[:,np.in1d(y_range,[3,4,8])]
m1=(x_range<5).nonzero()[0]
m2=np.in1d(y_range,[3,4,8]).nonzero()
b=a[m1[:,np.newaxis], m2]
assert np.allclose(b,b_correct)
b2=a[np.ix_(x_range<5,np.in1d(y_range,[3,4,8]))]
assert np.allclose(b2,b_correct)
np.ix_
往往比双重索引慢。 长形式解看来是快一点:
长式:使用np.ix_
In [85]: %timeit a[x_range<5,:][:,np.in1d(y_range,[3,4,8])]
10000 loops, best of 3: 144 us per loop
:
In [83]: %timeit a[(x_range<5).nonzero()[0][:,np.newaxis], (np.in1d(y_range,[3,4,8])).nonzero()[0]]
10000 loops, best of 3: 131 us per loop
双索引
In [84]: %timeit a[np.ix_(x_range<5,np.in1d(y_range,[3,4,8]))]
10000 loops, best of 3: 160 us per loop
注:这将是测试你的机器上的这些时间以来的排名可能会根据你的Python,numpy的,还是硬件的版本中改变一个好主意。
这真的没有意义。我会问在maillist为什么这样。 – tillsten
[scipy.org/Cookbook/Indexing](http://scipy.org/Cookbook/Indexing)p。关于多维布尔索引的14说:“看看numpy的蒙面数组工具......显而易见的方法并不能给出正确的答案。” (该文件写得很好,需要更新。) – denis
@denis,大约在2013年,该文件解释得相当好。但是,如果您使用Google numpy逻辑索引,那么出现的文档是http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html,这一点也没有解释清楚。 – John