我有一个数组(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
的值一样。
为什么会发生这种情况,如何修复它以获得所需的结果?
答案 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元素数组的原因。我不得不做两步分配来解决这个默认问题。