np.where 2D数组

时间:2015-05-13 11:37:17

标签: python arrays numpy

我用这个数据创建了一个numpy数组:

[[-180.          -80.           20.            1.           10.        ]
 [-180.          -80.           30.23255814    1.           10.        ]
 [-180.          -80.           40.46511628    1.           10.        ]
 ..., 
 [  90.           70.          439.53488372    1.           10.        ]
 [  90.           70.          449.76744186    1.           10.        ]
 [  90.           70.          460.            1.           10.        ]]
然后我跑了:

print a[np.where(a[-1])]

我希望这会再次打印整个数组,但它只能让我回到5行:

[[-180.          -80.           20.            1.           10.        ]
 [-180.          -80.           30.23255814    1.           10.        ]
 [-180.          -80.           40.46511628    1.           10.        ]
 [-180.          -80.           50.69767442    1.           10.        ]
 [-180.          -80.           60.93023256    1.           10.        ]]

我错过了什么?

使用以下方法创建数组:

x = np.linspace(-180,90,27)
y = np.linspace(-80,70,30)
z = np.linspace(20,460,44)
a = np.vstack(np.meshgrid(x,y,z,[1],[10])).reshape(5,-1).T

编辑:

此处的目标是识别最后一个元素大于0的行。对数据进行了一些处理,最后一列将被更改。

2 个答案:

答案 0 :(得分:4)

要回答更新的问题,您可以执行以下操作:

a[a[..., -1] > 0]

中间步骤示例:

>>> a
array([[4, 0, 3],
       [2, 1, 3],
       [3, 3, 3],
       [4, 2, 2],
       [2, 0, 0],
       [0, 2, 2],
       [0, 4, 2],
       [2, 1, 1],
       [0, 3, 1],
       [3, 2, 0]])
>>> a[..., -1]
array([3, 3, 3, 2, 0, 2, 2, 1, 1, 0])
>>> a[..., -1] > 0
array([ True,  True,  True,  True, False,  True,  True,  True,  True, False], dtype=bool)
>>> a[a[..., -1] > 0]
array([[4, 0, 3],
       [2, 1, 3],
       [3, 3, 3],
       [4, 2, 2],
       [0, 2, 2],
       [0, 4, 2],
       [2, 1, 1],
       [0, 3, 1]])
>>>

回答原来的问题:

首先,a[-1]返回最后一行(不是最后一列):

>>> a[-1]
array([  90.,   70.,  460.,    1.,   10.])

然后np.where返回此行的非零元素的索引,在这种情况下是每个元素:

>>> np.where(a[-1])
(array([0, 1, 2, 3, 4]),)

索引为a[indices]会返回与indices中的值对应的行,在这种情况下,这些行是前五行。

要返回整个数组,你当前必须跳过一些箍,因为默认是"笛卡尔"索引:

a[np.arange(a.shape[0])[..., None], np.arange(a.shape[1])]

inds = np.ix_(np.arange(a.shape[0]), np.arange(a.shape[1]))
a[inds]

NumPy可以支持"正交"将来编制索引(see this pull request以及对NumPy讨论邮件列表的长时间讨论),这应该允许更灵活的索引。

答案 1 :(得分:2)

如果目标是识别最后一列内容优于0的行,则可以尝试:

a[a[:,-1] > 0] 

或与np.where相同:

a[np.where(a[:, -1] > 0)]