Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否有一种方法可以使用numpy'对列执行多个检查;什么是数组索引?_Python_Arrays_Numpy - Fatal编程技术网

Python 是否有一种方法可以使用numpy'对列执行多个检查;什么是数组索引?

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

我有一个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.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。