在NumPy中过滤一个二维数组

10

我想从一个numpy的二维ndarray中取出满足最小值和最大值之间条件的子数组。

    xy_dat = get_xydata()
    x_displayed = xy_dat[((xy_dat > min) & (xy_dat < max))]

min和max是浮点数,用于与数组xy_dat的第一个值进行比较。

xy_dat是一个二维numpy数组:

[[ 735964.            1020.        ]
 [ 735964.04166667    1020.        ]
 [ 735964.08333333    1020.        ]
 ..., 
 [ 736613.39722222    1095.        ]
 [ 736613.40416667    1100.        ]
 [ 736613.41111111    1105.        ]]

x_displayed被正确过滤,但我失去了第二个值(现在它是一个一维数组):

[ 735964.04166667  735964.08333333  735964.125      
 ...,  
736613.39027778  736613.39722222  736613.40416667]

如何在第一个值上过滤并保留其他值?


这是因为你的比较不是二维的。例如,如果你在一行中有两个数字,一个在你的范围内,另一个不在,那么这意味着什么? - piman314
1个回答

15

你应该只对第一个列执行条件:

x_displayed = xy_dat[((xy_dat<b>[:,0]</b> > min) & (xy_dat<b>[:,0]</b> < max))]
我们在这里的做法是构建一个视图,只考虑第一列 xy_dat[:,0]。通过检查这个1d数组是否在给定的范围内,我们构造了一个1D布尔数组用于保留需要的行,并使用它作为参数在 xy_dat[..]中进行选择。

[:,0] 意味着遍历第一个数组的所有元素,只使用第二个数组的第一个元素?我不知道,这很好! - IMCoins
@IMCoins:它意味着每行的第一列,是的 :) - Willem Van Onsem
哦,是的,它只能用于numpy.arrays。我尝试在一些Python数组上使用它,结果我的眼睛感到异常悲伤。:'( - IMCoins
@IMCoins 你可以随时对列表进行子类化,并自己重载__getitem__ :) - cs95
@IMCoins:我们可以构建Python原始列表的子类,使其也能处理列表。然而,可能存在一个问题,即在Python中,项目可以是混合类型,子列表的大小也可能不同。那么,你会如何处理[1, [], [14], 'ab']?只需忽略非子列表和空列表吗? - Willem Van Onsem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接