删除3D numpy数组中包含负值的“行”

时间:2013-10-02 15:21:02

标签: python arrays numpy

我拥有的:

>>> forces
array([[[  63.82078252,    0.63841691],
        [ -62.45826693,    7.11946976],
        [ -87.85946925,   15.1988562 ],
        [-120.49417797,  -16.31785819],
        [ -81.36080338,    6.45074645]],

       [[ 364.99959095,    4.92473888],
        [ 236.5762723 ,   -7.22959548],
        [  69.55657789,    1.20164815],
        [ -22.1684177 ,   13.42611095],
        [ -91.19739147,  -16.15076634]]])

force [0]和force [1]每个都包含一个配对值列表,例如63.82078252& 0.63841691是一个数据点。

我想删除第一个值为负的所有对:

>>> forces
array([[[  63.82078252,    0.63841691]],

       [[ 364.99959095,    4.92473888],
        [ 236.5762723 ,   -7.22959548],
        [  69.55657789,    1.20164815]]])

但是这种类型的结构是不可能的,因为两片力的大小分别不同:(1,2)和(3,2)。

我的草率尝试:

>>> forces[:,:,0][forces[:,:,0] < 0] = np.nan
>>> forces
array([[[  63.82078252,    0.63841691],
        [          nan,    7.11946976],
        [          nan,   15.1988562 ],
        [          nan,  -16.31785819],
        [          nan,    6.45074645]],

       [[ 364.99959095,    4.92473888],
        [ 236.5762723 ,   -7.22959548],
        [  69.55657789,    1.20164815],
        [          nan,   13.42611095],
        [          nan,  -16.15076634]]])

然后使用isnan删除相关条目:

>>> forces = forces[~np.isnan(forces).any(axis=2)]
>>> forces
array([[  63.82078252,    0.63841691],
       [ 364.99959095,    4.92473888],
       [ 236.5762723 ,   -7.22959548],
       [  69.55657789,    1.20164815]])

所以这些是正确的值,但它们现在被归为一个2D数组。

对于这个简化的示例,我如何创建一个非均匀大小的“数组”,它将分别包含两个大小(1,2)和(3,2)的片段?

任何关于更优雅地完成任务的指示都将非常感激!

1 个答案:

答案 0 :(得分:6)

只是

forces[forces[..., 0] >= 0]

在此处阅读更多内容:http://scipy-lectures.github.io/intro/numpy/array_object.html#fancy-indexing