我用这个数据创建了一个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的行。对数据进行了一些处理,最后一列将被更改。
答案 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)]