布尔矩阵或列表计算,就好像where
有它转换为索引阵列:
In [285]: a[[True,True,False,False],[1,2]]
Out[285]: array([99, 99])
In [286]: a[np.where([True,True,False,False]),[1,2]]
Out[286]: array([[99, 99]])
In [287]: np.where([True,True,False,False])
Out[287]: (array([0, 1], dtype=int32),)
In [288]: a[[0,1], [1,2]]
Out[288]: array([99, 99])
所以这是采摘a[0,1]
和a[1,2]
,一个 '配对' 塞莱ction。
该块索引与阵列(或列表当量)彼此抵靠的是广播,以产生(2,2)阵列:
In [289]: a[np.ix_([0,1], [1,2])]
Out[289]:
array([[99, 2],
[ 4, 99]])
In [290]: a[[[0],[1]], [1,2]]
Out[290]:
array([[99, 2],
[ 4, 99]])
这种情况相当于一个2级索引:a[[0,1],:][:,[1,2]]
我正在使用np版本12.布尔指数在最近的版本中发生了一些变化。例如,如果布尔的长度不正确,它会运行,但会发出警告(这部分是新的)。
In [349]: a[[True,True,False],[1,2]]
/usr/local/bin/ipython3:1: VisibleDeprecationWarning: boolean index did not match indexed array along dimension 0; dimension is 4 but corresponding boolean dimension is 3
#!/usr/bin/python3
Out[349]: array([99, 99])
为13节的变化中描述:
https://docs.scipy.org/doc/numpy-dev/release.html#boolean-indexing-changes
我得到一个'IndexError:形状不匹配:索引阵列不能与形状(4)一起广播(2,)'对于您的查询... –
这只是下标索引,从每个dim的每个索引中选取一组索引中的每个元素。所以,它的索引用'(0,1)'[0从布尔数组的第一个TRUE elem,1从int索引数组的第一个元素]为第一个elem和'(1,2)'为第二个。 – Divakar
@WillemVanOnsem我认为OP意味着使用布尔**阵列**不只是一个普通的Python列表索引。如果你将它们转换为数组,那么你会得到OP的结果。 – kmario23