【问题标题】:compare tuple with tuples in numpy array将元组与 numpy 数组中的元组进行比较
【发布时间】:2015-01-15 22:52:15
【问题描述】:

我有一个数组 (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)

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

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

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

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

为什么会发生这种情况,我该如何解决它以获得所需的结果?

【问题讨论】:

    标签: python numpy tuples


    【解决方案1】:

    使用列表理解进行比较:

    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]
    

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

    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 元素数组的原因。我必须执行 2 步作业才能绕过该默认设置。

    【讨论】:

      猜你喜欢
      • 2021-06-24
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      • 2018-06-28
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      相关资源
      最近更新 更多