我有以下numpy数组:
ar = np.array([[(1,2),2],[(2,3),"hi"],[(3,3,3),"bye"],[(1,2),2]])
我想获得[(1,2),2]
的索引(0和3应该是输出)
我尝试使用np.where
,但效果不佳
有没有人知道这样做的有效方法?
由于
答案 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]),)