Python 是否有一种方法可以使用numpy'对列执行多个检查;什么是数组索引?
我有一个2D数据数组,我正试图有效地从这些数据中删除坏列。我正在尝试删除任何包含值0、最小值和最大值之间的绝对差值大于12或包含值大于9.5的列 我的代码可以工作,但速度相当慢。据我所知,在后台,对于每一行代码,我的数组上都有一个循环。我想知道是否有办法将其简化为一个循环Python 是否有一种方法可以使用numpy'对列执行多个检查;什么是数组索引?,python,arrays,numpy,Python,Arrays,Numpy,我有一个2D数据数组,我正试图有效地从这些数据中删除坏列。我正在尝试删除任何包含值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
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]
将numpy导入为np
数据数组=数据数组[:,abs(数据数组).min(0)!=0]
data_array=data_array[:,abs(data_array.min(0)-data_array.max(0))<12]
数据数组=数据数组[:,abs(数据数组)。最大值(0)<9.5]
我认为不可能在一个循环中执行这三个检查
您可以通过正确地排序修剪操作来提高性能。实际上,您应该首先检查删除大多数列的条件,以便传递给第二个筛选器的数组尽可能小。相同的标准适用于其余的过滤器
根据注释,您的数据范围从-30
到30
。可以预期,最常见的无效列是那些包含大于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
我认为不可能在一个循环中执行这三个检查 您可以通过正确地排序修剪操作来提高性能。实际上,您应该首先检查删除大多数列的条件,以便传递给第二个筛选器的数组尽可能小。相同的标准适用于其余的过滤器 根据注释,您的数据范围从
-30
到30
。可以预期,最常见的无效列是那些包含大于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
嗨,谢谢你的回答。我尝试实现这个解决方案,但它没有加快我的代码。当我提出这个问题时,我并不是说我在代码的其他地方有一个循环。这三行是我用来精简阵列的全部。恐怕我误解了你的问题。你的数组可以有负值吗?是的,它可以有负值。但是,它不会有任何大于30或小于-30的值。数组的大小是多少?它会有所不同。这些阵列是来自实验的数据。尺寸从500 x 200到2000 x 1000不等。您好,谢谢您的回答。我尝试实现这个解决方案,但它没有加快我的代码。当我提出这个问题时,我并不是说我在代码的其他地方有一个循环。这三行是我用来精简阵列的全部。恐怕我误解了你的问题。你的数组可以有负值吗?是的,它可以有负值。但是,它不会有任何大于30或小于-30的值。数组的大小是多少?它会有所不同。这些阵列是来自实验的数据。尺寸范围从500 x 200到2000 x 1000。