Как мне удалить все нулевые элементы из массива NumPy?

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

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

21
задан MSeifert 10 August 2019 в 04:48
поделиться

1 ответ

Я решил сравнить время выполнения разных подходов, упомянутых здесь. Я пользовался своей библиотекой simple_benchmark для этого.

индексация булевской переменной с array[array != 0], кажется, является самой быстрой (и самой короткой) решение.

enter image description here

Для меньших массивов подход 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()
0
ответ дан 16 October 2019 в 23:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: