У меня есть numpy.array 1-го ранга, из которого я хочу создать коробочный сюжет.Тем не менее, я хочу исключить все значения, равные нулю в массиве ... В настоящее время я решил эту проблему, зациклив массив и скопировав значение в новый массив, если он не равен нулю.Однако, поскольку массив состоит из 86 000 000 значений, и мне приходится делать это несколько раз, это требует большого терпения.
Есть ли более разумный способ сделать это?
Для массива NumPy a вы можете использовать
a
a[a != 0]
для извлечения значений, не равных нулю.
это тот случай, когда вы хотите использовать маскированные массивы, он сохраняет форму вашего массива и автоматически распознается всеми функциями 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
Простая строка кода может получить массив, исключающий все значения '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]
Я хотел бы предложить вам просто использовать NaN для подобных случаев, когда вы хотите игнорировать некоторые значения, но при этом хотите сохранить статистическую процедуру как можно более значимой. Так
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)
Вы можете индексировать с помощью логического массива.Для массива NumPy A:
A
res = A[A != 0]
Вы можете использовать Индексирование логического массива , как указано выше, bool преобразование типа, np.nonzero или np.where.Вот несколько тестов производительности:
bool
np.nonzero
np.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