在元组的ndarray中查找元组并返回搜索到的元组的索引

Posted

技术标签:

【中文标题】在元组的ndarray中查找元组并返回搜索到的元组的索引【英文标题】:find tuple in ndarray of tuples and return index of searched tuple 【发布时间】:2019-07-15 15:34:33 【问题描述】:

我有一个坐标条目作为元组的ndarray的字典,

import numpy as np

data = np.arange(0, 18)
coord = [(i, i, i) for i in data]
arr = np.empty(18, dtype=object)
arr[:] = coord
arr = arr.reshape(3, 6)

d = dict()
d.update('coord': arr) 

我想用坐标查询字典并返回它在数组中的索引。

当我尝试使用np.where 查找索引时,它返回不匹配。

np.where(d['coord'] == (0, 0, 0))
(array([], dtype=int64),)

理想情况下,这将返回索引(0, 0)

当为字典条目和元组值提供索引时,它返回True,因此元组存在于索引处。

d['coord'][0,0] == (0, 0, 0)
True

我可以这样获取索引吗??

谢谢。

【问题讨论】:

你自己看情况了吗? where 所做的只是找到其参数的非零 (True) 元素的索引。 d['coord']==(0, 0, 0) 【参考方案1】:

问题在于带有元组的对象数组的 == 测试。

In [346]: d['coord']                                                            
Out[346]: 
array([[(0, 0, 0), (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5)],
       [(6, 6, 6), (7, 7, 7), (8, 8, 8), (9, 9, 9), (10, 10, 10),
        (11, 11, 11)],
       [(12, 12, 12), (13, 13, 13), (14, 14, 14), (15, 15, 15),
        (16, 16, 16), (17, 17, 17)]], dtype=object)
In [347]: d['coord']==(0, 0, 0)                                                 
/usr/local/bin/ipython3:1: DeprecationWarning: elementwise == comparison failed; this will raise an error in the future.
  #!/usr/bin/python3
Out[347]: False

解决方法是将一个对象数组与另一个对象数组进行比较:

In [348]: x=np.array(None); x[()]=(0,0,0)                                       
In [349]: x                                                                     
Out[349]: array((0, 0, 0), dtype=object)
In [350]: d['coord']==x                                                         
Out[350]: 
array([[ True, False, False, False, False, False],
       [False, False, False, False, False, False],
       [False, False, False, False, False, False]])

【讨论】:

太棒了,谢谢。所以必须是类似比较的 dtype 才能匹配? 使用数字 dtype 有更大的灵活性,但 object dtype 有很多自己的“规则”。

以上是关于在元组的ndarray中查找元组并返回搜索到的元组的索引的主要内容,如果未能解决你的问题,请参考以下文章

PySpark UDF 返回可变大小的元组

在元组列表中查找元素

遍历 pandas 数据框中的行并匹配列表中的元组并创建一个新的 df 列

在元组列表中查找索引位置

从 Sqlite 表中选择行的元组并有效地对元组进行排序

嵌套列表的元组