2

我有的:

>>> 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] 和forces [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]])

所以这些是正确的值,但它们现在被集中到一个二维数组中。

对于这个简化的示例,如何创建一个大小不同的“数组”,该“数组”将分别包含两个大小为 (1, 2) 和 (3, 2) 的切片?

此外,任何关于更优雅地完成任务的指示都将不胜感激!

4

1 回答 1

6

简直是

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

在这里阅读更多:http: //scipy-lectures.github.io/intro/numpy/array_object.html#fancy-indexing

于 2013-10-02T15:28:12.463 回答