python 带条件的阵列滤波

brvekthn  于 2023-01-04  发布在  Python
关注(0)|答案(2)|浏览(251)

(我不确定标题是否正确)
我有一个numpy.arrayf,如下所示:

# 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 ]
uyto3xhc

uyto3xhc1#

对于只要求一个索引的二维数组,返回与该索引对应的行(包含所有列),因此:

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

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

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

您可以使用它通过花哨的索引来获取其索引在b中具有对应True值的所有行。

c = a[ b ]

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

sr4lhrrt

sr4lhrrt2#

引用Tentative Numpy Tutorial
...当提供的索引少于轴数时,丢失的索引被视为完整切片...
因此,f[f[:,0]==1]被转换为f[f[:,0]==1,:](或者等价地,转换为f[f[:,0]==1,...]),从程序员的Angular 来看,这是完全相同的。

相关问题