1

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

我有一个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 ]
4

2 回答 2

1

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

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

当你这样做时,a[0]==1你会得到一个布尔数组,比如:

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

您可以通过花哨的索引来获取所有索引Trueb. 在这个例子中,做:

c = a[ b ]

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

于 2013-06-07T11:26:42.333 回答
0

引用Tentative Numpy 教程

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

所以f[f[:,0]==1]被翻译为f[f[:,0]==1,:](或等效地,为f[f[:,0]==1,...]),从程序员的角度来看,它们都是一样的。

于 2013-06-07T16:05:57.470 回答