从numpy.array中删除数据

rub*_*ens 22 python arrays filtering numpy

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

有更聪明的方法吗?

Sve*_*ach 46

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

a[a != 0]
Run Code Online (Sandbox Code Playgroud)

提取不等于零的值.

  • @rubae:如果“a”具有更高的维度,则结果将是一个扁平(一维)数组。还可以删除全为零的列或行。 (3认同)

And*_*nca 18

在这种情况下,您希望使用屏蔽数组,它保持数组的形状,并由所有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
Run Code Online (Sandbox Code Playgroud)


MSe*_*ert 11

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

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

在此处输入图片说明

对于较小的数组,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()
Run Code Online (Sandbox Code Playgroud)


小智 6

一行简单的代码可以为您提供一个排除所有'0'值的数组:

np.argwhere(*array*)
Run Code Online (Sandbox Code Playgroud)

例:

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

[1, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

  • np.argwhere 仅返回非零元素的索引 (6认同)
  • 因此,这个数组纯粹是运气好,似乎恰好满足了问题,但却具有误导性。根据 argwhere 的结果,您可以重建非零数组,但这是一个额外的步骤。 (2认同)