过滤 2D numpy 数组

Posted

技术标签:

【中文标题】过滤 2D numpy 数组【英文标题】:Filter a 2D numpy array 【发布时间】:2018-06-01 19:43:53 【问题描述】:

我想要一个 numpy 2D ndarray 的子数组(在最小值和最大值之间)

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

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

xy_dat 是一个 2D 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]

如何对第一个值进行过滤并保留另一个?

【问题讨论】:

那是因为你的比较不是二维的。例如,一行中有两个数字,一个在范围内,一个不在范围内,这意味着什么? 【参考方案1】:

您应该只在 first 列上执行条件:

x_displayed = xy_dat[((xy_dat<b>[:,0]</b> &gt; min) &amp; (xy_dat<b>[:,0]</b> &lt; max))]

我们在这里所做的是构建一个视图,其中我们只考虑带有xy_dat[:,0] 的第一列。现在通过检查这个 1d 是否在边界之间,我们构造了一个我们应该保留的行的 1D 布尔数组,现在我们通过将其用作 xy_dat[..] 参数中的项目来选择这些行.

【讨论】:

[:,0] 表示通过所有第一个数组,只有第二个数组的第一个元素?不知道,这很整洁! @IMCoins: 这意味着每一行的第一列是的:) 哦,对了,它只适用于 numpy.arrays。我在一些python数组上试了一下,眼中闪过一些不可思议的悲伤。 :'( @IMCoins 你总是可以继承列表并重载__getitem__自己:) @IMCoins:我们可以构建 Python vanilla 列表的子类,让它也可以与列表一起使用。然而,一个可能的问题是,在 Python 中,项目可以是混合的,并且子列表可以有不同的大小。那么您将如何使用[1, [], [14], 'ab']?简单地忽略非子列表和空列表?

以上是关于过滤 2D numpy 数组的主要内容,如果未能解决你的问题,请参考以下文章

Convolve2d 只需使用 Numpy

具有 numpy 的数组的高效阈值过滤器

如何高斯过滤(模糊)浮点numpy数组

使用数组进行 Numpy 过滤

Python numpy 多维数组由另一个数组值过滤

Python numpy 按条件过滤二维数组