Удаление данных из numpy.array

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

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

Ответы

Ответ 1

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

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

a[a != 0]

чтобы извлечь значения, не равные нулю.

Ответ 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