将元组与numpy数组中的元组进行比较

时间:2015-01-15 22:52:15

标签: python numpy tuples

我有一个数组(dtype = object),第一列包含数组元组,第二列包含标量。我想要第二列中的所有标量,其中第一列中的元组等于某个元组。

>>> X
array([[(array([ 21.]), array([ 13.])), 0.29452519286647716],
   [(array([ 25.]), array([ 9.])), 0.9106600600510809],
   [(array([ 25.]), array([ 13.])), 0.8137344043493814],
   [(array([ 25.]), array([ 14.])), 0.8143093864975313],
   [(array([ 25.]), array([ 15.])), 0.6004337591112664],
   [(array([ 25.]), array([ 16.])), 0.6239450452872853],
   [(array([ 21.]), array([ 13.])), 0.32082105959687424]], dtype=object)

我想要第1列等于X [0,0]的所有行。

ar = X[0,0]
>>> ar
(array([ 21.]), array([ 13.]))

我要检查X[:,0]==ar应该找到那些行。然后我会通过X[X[:,0]==ar,1]检索我的最终结果。

然而,似乎发生的事情是ar被解释为2维数组,ar中的每个元素都与X[:,0]中的元组进行比较。在这种情况下,这产生一个2x7阵列,所有条目等于False。相比之下,比较X[0,0]==ar就像我希望它给出True的值一样。

为什么会发生这种情况,如何修复它以获得所需的结果?

1 个答案:

答案 0 :(得分:2)

使用列表理解进行比较:

In [176]: [x==ar for x in X[:,0]]
Out[176]: [True, False, False, False, False, False, True]

这是将元组与元组进行比较

比较元组ID会产生不同的结果

In [175]: [id(x)==id(ar) for x in X[:,0]]
Out[175]: [True, False, False, False, False, False, False]

因为第二场比赛有不同的身份。

In [177]: X[:,0]==ar
Out[177]: 
array([[False, False, False, False, False, False, False],
       [False, False, False, False, False, False, False]], dtype=bool)

会返回(2,7)结果,因为它会将(7,)数组与(2,1)数组(np.array(ar))进行比较。

但这就像理解一样:

In [190]: ar1=np.zeros(1,dtype=object)

In [191]: ar1[0]=ar

In [192]: ar1
Out[192]: array([(array([ 21.]), array([ 13.]))], dtype=object)

In [193]: X[:,0]==ar1
Out[193]: array([ True, False, False, False, False, False,  True], dtype=bool)

art1是包含ar元组的1元素数组。现在,与X[:,0]元素的比较按预期进行。

np.array(...)尝试创建与输入数据允许的维数一样高的数组。这就是为什么它将2元素元组转换为2元素数组的原因。我不得不做两步分配来解决这个默认问题。