在多维numpy数组中查找索引

时间:2015-01-06 08:54:20

标签: python arrays numpy

我有以下numpy数组:

ar = np.array([[(1,2),2],[(2,3),"hi"],[(3,3,3),"bye"],[(1,2),2]])

我想获得[(1,2),2]的索引(0和3应该是输出)

我尝试使用np.where,但效果不佳

有没有人知道这样做的有效方法?

由于

2 个答案:

答案 0 :(得分:1)

np.where(np.all(ar == [(1,2),2], axis=1))

即,找到等于[(1,2),2]的位置,使用AND将2D结果转换为1D,然后执行where将布尔掩码转换为数字索引。

答案 1 :(得分:1)

where的使用因ar的元素是混合包(数字,元组和字符串)而变得复杂,因此object dtype。形状是(4,2)

In [41]: ar = np.array([[(1,2),2],[(2,3),"hi"],[(3,3,3),"bye"],[(1,2),2]])
In [42]: ar
Out[42]: 
array([[(1, 2), 2],
       [(2, 3), 'hi'],
       [(3, 3, 3), 'bye'],
       [(1, 2), 2]], dtype=object)

它可以将它与1行数组(列表)进行比较:

In [43]: ar==[(1,2),2]
Out[43]: 
array([[ True,  True],
       [False, False],
       [False, False],
       [ True,  True]], dtype=bool)

where只给出了这个布尔数组中的True值的索引

In [44]: np.where(ar==[(1,2),2])
Out[44]: (array([0, 0, 3, 3]), array([0, 1, 0, 1]))

或者由于您需要两个值匹配的行,请添加np.all

In [62]: np.where(np.all(ar==[(1,2),2],1))
Out[62]: (array([0, 3]),)

在这种情况下,使用数组对列表列表几乎没有价值:

In [53]: arl=ar.tolist()
In [54]: arl.index([(1,2),2])
Out[54]: 0
In [56]: arl.index([(1,2),2],1)
Out[56]: 3

通常,对象dtype数组出现在复杂的dtypes中,有几个字段。例如,如果我们定义一个包含2个字段的复合dtype:

dt2 = np.dtype([('1st','O'),('2nd','O')])

并更改ar值,使其成为元组列表(而不是列表列表)

ar1 = [((1, 2), 2), ((2, 3), 'hi'), ((3, 3, 3), 'bye'), ((1, 2), 2)]
arr = np.array(ar1,dt2)

生成的数组具有形状(4,),每个元素都是复合元素(显示为元组):

array([((1, 2), 2), ((2, 3), 'hi'), ((3, 3, 3), 'bye'), ((1, 2), 2)], 
    dtype=[('1st', 'O'), ('2nd', 'O')])

可以通过以下方式测试:

arr==np.array(((1,2),2), dt2)
# array([ True, False, False,  True], dtype=bool)

相应的地方是:

np.where(arr==np.array(((1,2),2), dt2))
# (array([0, 3]),)