Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Filtering - Fatal编程技术网

Python 如何从NumPy数组中删除所有零元素?

Python 如何从NumPy数组中删除所有零元素?,python,arrays,numpy,filtering,Python,Arrays,Numpy,Filtering,我有一个rank-1numpy.array,我想用它做一个箱线图。但是,我想排除数组中所有等于零的值。目前,我通过循环数组并将值复制到新数组(如果不等于零)来解决这个问题。但是,由于数组由8600000个值组成,我必须多次这样做,这需要很多耐心 有没有更智能的方法可以做到这一点?对于NumPy数组a,您可以使用 a[a != 0] 要提取不等于零的值。对于NumPy数组a,可以使用 a[a != 0] 提取不等于零的值。我建议您在这种情况下使用NaN,您希望忽略一些值,但仍希望尽可能保持过程

我有一个rank-1
numpy.array
,我想用它做一个箱线图。但是,我想排除数组中所有等于零的值。目前,我通过循环数组并将值复制到新数组(如果不等于零)来解决这个问题。但是,由于数组由8600000个值组成,我必须多次这样做,这需要很多耐心


有没有更智能的方法可以做到这一点?

对于NumPy数组
a
,您可以使用

a[a != 0]

要提取不等于零的值。

对于NumPy数组
a
,可以使用

a[a != 0]

提取不等于零的值。

我建议您在这种情况下使用
NaN
,您希望忽略一些值,但仍希望尽可能保持过程的统计意义。所以

In []: X= randn(1e3, 5)
In []: X[abs(X)< .1]= NaN
In []: isnan(X).sum(0)
Out[: array([82, 84, 71, 81, 73])
In []: boxplot(X)
[]中的
:X=randn(1e3,5)
In[]:X[abs(X)<.1]=NaN
在[]中:isnan(X).sum(0)
Out[:数组([82,84,71,81,73])
在[]中:箱线图(X)

我建议您在这种情况下只需使用
NaN
,您可以忽略一些值,但仍希望尽可能保持程序的统计意义。因此

In []: X= randn(1e3, 5)
In []: X[abs(X)< .1]= NaN
In []: isnan(X).sum(0)
Out[: array([82, 84, 71, 81, 73])
In []: boxplot(X)
[]中的
:X=randn(1e3,5)
In[]:X[abs(X)<.1]=NaN
在[]中:isnan(X).sum(0)
Out[:数组([82,84,71,81,73])
在[]中:箱线图(X)

在这种情况下,如果要使用遮罩数组,它会保持数组的形状,并且会被所有numpy和matplotlib函数自动识别

X = np.random.randn(1e3, 5)
X[np.abs(X)< .1]= 0 # some zeros
X = np.ma.masked_equal(X,0)
plt.boxplot(X) #masked values are not plotted

#other functionalities of masked arrays
X.compressed() # get normal array with masked values removed
X.mask # get a boolean array of the mask
X.mean() # it automatically discards masked values
X=np.random.randn(1e3,5)
X[np.abs(X)<.1]=0#一些零
X=np.ma.masked_等于(X,0)
plt.箱线图(X)#未绘制遮罩值
#屏蔽阵列的其他功能
X.compressed()#获取移除屏蔽值的正常数组
X.mask#获取掩码的布尔数组
X.mean()#它会自动丢弃屏蔽值

在这种情况下,如果要使用遮罩数组,它会保持数组的形状,并且会被所有numpy和matplotlib函数自动识别

X = np.random.randn(1e3, 5)
X[np.abs(X)< .1]= 0 # some zeros
X = np.ma.masked_equal(X,0)
plt.boxplot(X) #masked values are not plotted

#other functionalities of masked arrays
X.compressed() # get normal array with masked values removed
X.mask # get a boolean array of the mask
X.mean() # it automatically discards masked values
X=np.random.randn(1e3,5)
X[np.abs(X)<.1]=0#一些零
X=np.ma.masked_等于(X,0)
plt.箱线图(X)#未绘制遮罩值
#屏蔽阵列的其他功能
X.compressed()#获取移除屏蔽值的正常数组
X.mask#获取掩码的布尔数组
X.mean()#它会自动丢弃屏蔽值

一行简单的代码可以得到一个排除所有“0”值的数组:

np.argwhere(*array*)
例如:

import numpy as np
array = [0, 1, 0, 3, 4, 5, 0]
array2 = np.argwhere(array)
print array2

[1, 3, 4, 5]

一行简单的代码可以得到一个排除所有“0”值的数组:

np.argwhere(*array*)
例如:

import numpy as np
array = [0, 1, 0, 3, 4, 5, 0]
array2 = np.argwhere(array)
print array2

[1, 3, 4, 5]

您可以使用布尔数组进行索引。对于NumPy数组
a

res = A[A != 0]
您可以如上所述使用,
bool
type conversion,或。以下是一些性能基准测试:

# Python 3.7, NumPy 1.14.3

np.random.seed(0)

A = np.random.randint(0, 5, 10**8)

%timeit A[A != 0]          # 768 ms
%timeit A[A.astype(bool)]  # 781 ms
%timeit A[np.nonzero(A)]   # 1.49 s
%timeit A[np.where(A)]     # 1.58 s

您可以使用布尔数组进行索引。对于NumPy数组
a

res = A[A != 0]
您可以如上所述使用,
bool
type conversion,或。以下是一些性能基准测试:

# Python 3.7, NumPy 1.14.3

np.random.seed(0)

A = np.random.randint(0, 5, 10**8)

%timeit A[A != 0]          # 768 ms
%timeit A[A.astype(bool)]  # 781 ms
%timeit A[np.nonzero(A)]   # 1.49 s
%timeit A[np.where(A)]     # 1.58 s

我决定比较一下这里提到的不同方法的运行时,我已经使用了我的库

使用
array[array!=0]
的布尔索引似乎是最快(也是最短)的解决方案

对于较小的数组,与其他方法相比,MaskedArray方法非常慢,但是与布尔索引方法一样快。但是对于中等大小的数组,它们之间没有太大差异

以下是我使用的代码:

从simple_benchmark导入BenchmarkBuilder
将numpy作为np导入
bench=BenchmarkBuilder()
@bench.add_函数()
def布尔_索引(arr):
返回arr[arr!=0]
@bench.add_函数()
def整数索引非零(arr):
返回arr[np.非零(arr)]
@bench.add_函数()
def整数索引,其中(arr):
返回arr[np.where(arr!=0)]
@bench.add_函数()
def屏蔽_阵列(arr):
返回np.ma.masked_equal(arr,0)
@添加参数('数组大小')
def参数_提供程序():
对于范围(3,25)内的exp:
尺寸=2**exp
arr=np.随机.随机(大小)
arr[arr<0.1]=0#加上一些零
产量大小
r=工作台运行()
r、 绘图()

我决定比较这里提到的不同方法的运行时。为此,我使用了我的库

使用
array[array!=0]
的布尔索引似乎是最快(也是最短)的解决方案

对于较小的数组,与其他方法相比,MaskedArray方法非常慢,但是与布尔索引方法一样快。但是对于中等大小的数组,它们之间没有太大差异

以下是我使用的代码:

从simple_benchmark导入BenchmarkBuilder
将numpy作为np导入
bench=BenchmarkBuilder()
@bench.add_函数()
def布尔_索引(arr):
返回arr[arr!=0]
@bench.add_函数()
def整数索引非零(arr):
返回arr[np.非零(arr)]
@bench.add_函数()
def整数索引,其中(arr):
返回arr[np.where(arr!=0)]
@bench.add_函数()
def屏蔽_阵列(arr):
返回np.ma.masked_equal(arr,0)
@添加参数('数组大小')
def参数_提供程序():
对于范围(3,25)内的exp:
尺寸=2**exp
arr=np.随机.随机(大小)
arr[arr<0.1]=0#加上一些零
产量大小
r=工作台运行()
r、 绘图()

[i为数组中的i,如果i!=0.0]
如果数字是浮点数
[i为i,如果i!=0]
如果数字为int。

[i为i,如果i!=0.0]
如果数字为浮点数
或者
[i为i,如果i!=0]
如果数字为int。

非常感谢,这确实非常有效(!)更快。是否可以在更高秩的NumMpy数组或矩阵上执行类似的操作?因为在这里,出现了二元数不再正确匹配的问题…@rubae:If
a
具有更高的维数,结果将是一个扁平(一维)数组。还可以删除