Sve*_*ach 46
对于NumPy数组a,您可以使用
a[a != 0]
Run Code Online (Sandbox Code Playgroud)
提取不等于零的值.
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)
| 归档时间: |
|
| 查看次数: |
57263 次 |
| 最近记录: |