gpt4 book ai didi

python - 有没有办法使用 numpy 的数组索引对列执行多重检查?

转载 作者:太空宇宙 更新时间:2023-11-03 21:01:55 24 4
gpt4 key购买 nike

我有一个二维数据数组,我正在尝试有效地从该数据中删除坏列。我正在尝试删除包含值 0、最小值和最大值之间的绝对差值大于 12 或包含值大于 9.5 的任何列。

我的代码可以工作,但速度相当慢。据我了解,在后台,每一行代码的数组上都有一个循环。我想知道是否有一种方法可以将其减少到一个循环。

import numpy as np

data_array = data_array[:,abs(data_array).min(0)!=0]
data_array = data_array[:,abs(data_array.min(0)-data_array.max(0)) < 12]
data_array = data_array[:,abs(data_array).max(0) < 9.5]

最佳答案

我认为不可能在一个循环中执行这三项检查。

通过正确排序修剪操作,您可能会提高性能。事实上,您应该首先检查删除最多列的条件,以便传递到第二个过滤器的数组尽可能小。相同的标准适用于其余的过滤器。

根据评论,您的数据范围从 -3030。人们可以预期,最常见的无效列是那些包含大于 9.5 的值的列。我还猜测列被丢弃的最不常见的原因是零值的存在。如果这些假设不正确,您应该相应地更改过滤器的顺序。可以通过删除不必要的函数调用(例如 abs)来实现进一步的改进。

以下函数以如上所述的不同顺序实现相同的过滤操作:

import numpy as np

def trim(x, low=0, high=9.5, diff=12):
x = x[:, np.all(x != 0, axis=0)]
x = x[:, np.ptp(x, axis=0) <= diff]
x = x[:, np.all(x <= high, axis=0)]
return x

def trim_reordered(x, low=0, high=9.5, diff=12):
x = x[:, np.all(x <= high, axis=0)]
x = x[:, np.ptp(x, axis=0) <= diff]
x = x[:, np.all(x != 0, axis=0)]
return x

演示

In [205]: np.random.seed(213)

In [206]: small_arr = np.random.randint(low=-30, high=30, size=(3, 10))

In [207]: small_arr
Out[207]:
array([[ 13, 6, 2, -29, 13, 11, -12, -24, 5, 9],
[ 29, 24, 16, -21, -27, -5, -5, -16, 21, -29],
[-10, 10, -24, -10, 4, 0, -8, -23, 0, 4]])

In [208]: trim(small_arr)
Out[208]:
array([[-12, -24],
[ -5, -16],
[ -8, -23]])

In [209]: large_arr = np.random.randint(low=-30, high=30, size=(10, 10**6))

In [210]: %timeit trim(large_arr)
77.3 ms ± 470 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [211]: %timeit trim_reordered(large_arr)
16.1 ms ± 174 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [212]: np.all(trim(large_arr) == trim_reordered(large_arr))
Out[212]: True

关于python - 有没有办法使用 numpy 的数组索引对列执行多重检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55659818/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com