从numpy.array中删除数据

时间:2011-05-08 11:36:12

标签: python numpy slice boxplot

我有一个排名为1的numpy.array,我想制作一个箱形图。但是,我想在数组中排除所有等于零的值......目前,我通过循环数组并将值复制到新数组(如果不等于零)来解决此问题。但是,由于数组包含86 000 000个值,而且我必须多次执行此操作,因此需要很大的耐心。

有更聪明的方法吗?

7 个答案:

答案 0 :(得分:41)

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

a[a != 0]

提取不等于零的值。

答案 1 :(得分:14)

这是一种你想要使用蒙版数组的情况,它保持数组的形状,并且它被所有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

答案 2 :(得分:5)

一行简单的代码可以为您提供一个排除所有&#39; 0&#39;值:

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]

答案 3 :(得分:3)

我建议您只使用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)

enter image description here

答案 4 :(得分:1)

您可以使用布尔数组建立索引。对于NumPy数组A

res = A[A != 0]

您可以如上所述使用Boolean array indexingbool类型转换,np.nonzeronp.where。这是一些性能基准测试:

# 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

答案 5 :(得分:0)

我决定比较这里提到的不同方法的运行时间。我已经使用了我的图书馆simple_benchmark

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

enter image description here

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

这是我使用的代码:

from simple_benchmark import BenchmarkBuilder

import numpy as np

bench = BenchmarkBuilder()

@bench.add_function()
def boolean_indexing(arr):
    return arr[arr != 0]

@bench.add_function()
def integer_indexing_nonzero(arr):
    return arr[np.nonzero(arr)]

@bench.add_function()
def integer_indexing_where(arr):
    return arr[np.where(arr != 0)]

@bench.add_function()
def masked_array(arr):
    return np.ma.masked_equal(arr, 0)

@bench.add_arguments('array size')
def argument_provider():
    for exp in range(3, 25):
        size = 2**exp
        arr = np.random.random(size)
        arr[arr < 0.1] = 0  # add some zeros
        yield size, arr

r = bench.run()
r.plot()

答案 6 :(得分:0)

[i for i in Array if i != 0.0] 如果数字是浮点数 或 [i for i in SICER if i != 0] 如果数字是整数。