具有条件的阵列过滤

时间:2013-06-07 11:17:08

标签: python numpy

(我不确定标题的正确性)

我有一个numpy.array f,如下所示:

# id frame x y z

我想要做的是提取某些特定id的轨迹。对于id==1,我得到了例如:

f_1 = f[ f[:,0]==1 ]

并获取

array([[   1.     ,   55.     ,  381.51   , -135.476  ,  163.751  ],
       [   1.     ,   56.     ,  369.176  , -134.842  ,  163.751  ],
       [   1.     ,   57.     ,  357.499  , -134.204  ,  163.751  ],
       [   1.     ,   58.     ,  346.65   , -133.786  ,  163.751  ],
       [   1.     ,   59.     ,  336.602  , -133.762  ,  163.751  ],
       [   1.     ,   60.     ,  326.762  , -135.157  ,  163.751  ],
       [   1.     ,   61.     ,  315.77   , -135.898  ,  163.751  ],
       [   1.     ,   62.     ,  303.806  , -136.855  ,  163.751  ],
       [   1.     ,   63.     ,  291.273  , -138.255  ,  163.751  ],
       [   1.     ,   64.     ,  278.767  , -139.824  ,  163.751  ],
       [   1.     ,   65.     ,  266.778  , -141.123  ,  163.751  ],
       [   1.     ,   66.     ,  255.773  , -142.42   ,  163.751  ],
       [   1.     ,   67.     ,  244.864  , -143.314  ,  163.751  ]])

我的问题是我不确定我是否理解它是如何工作的。通常我期待的是:

f_1 = f[ f[:,0]==1, : ]

这对我来说也很有意义。 (取所有列,但只列出满足所需条件的行)

有人可以解释为什么这种形式也有效以及究竟会发生什么?

f_1 = f[ f[:,0]==1 ]

2 个答案:

答案 0 :(得分:1)

对于只询问一个索引的2D数组,返回与该索引对应的行(包含所有列),以便:

np.all( a[0] == a[0,:] )
#True

执行a[0]==1时会得到一个布尔数组,如:

b = a[0]==1
#array([True, True, False, False, True], dtype=bool)

您可以通过花式索引来获取其索引在True中具有相应b值的所有行。在这个例子中,做:

c = a[ b ]

将获得与索引[0,1,4]对应的行。通过直接传递这些索引可以获得相同的结果,例如c = a[ [0,1,4] ]

答案 1 :(得分:0)

引用Tentative Numpy Tutorial

  

...当提供的索引数少于轴数时,缺失的索引将被视为完整切片......

因此f[f[:,0]==1]被转换为f[f[:,0]==1,:](或等效地转移到f[f[:,0]==1,...]),这些都是程序员所有相同的事情。透视图。