удаление данных из numpy.array - PullRequest
16 голосов
/ 08 мая 2011

У меня есть numpy.array 1-го ранга, из которого я хочу создать коробочный сюжет.Тем не менее, я хочу исключить все значения, равные нулю в массиве ... В настоящее время я решил эту проблему, зациклив массив и скопировав значение в новый массив, если он не равен нулю.Однако, поскольку массив состоит из 86 000 000 значений, и мне приходится делать это несколько раз, это требует большого терпения.

Есть ли более разумный способ сделать это?

Ответы [ 5 ]

41 голосов
/ 08 мая 2011

Для массива NumPy a вы можете использовать

a[a != 0]

для извлечения значений, не равных нулю.

15 голосов
/ 09 мая 2011

это тот случай, когда вы хотите использовать маскированные массивы, он сохраняет форму вашего массива и автоматически распознается всеми функциями 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
6 голосов
/ 19 февраля 2018

Простая строка кода может получить массив, исключающий все значения '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]
3 голосов
/ 08 мая 2011

Я хотел бы предложить вам просто использовать 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

1 голос
/ 02 января 2019

Вы можете индексировать с помощью логического массива.Для массива NumPy A:

res = A[A != 0]

Вы можете использовать Индексирование логического массива , как указано выше, 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
...