Numpy инициализация маскированного массива из другого массива - PullRequest
1 голос
/ 26 марта 2020

Есть ли более чистый способ инициализации маскированного массива numpy от non-ma со всеми маскированными значениями False, чем этот?

masked_array = np.ma.masked_array(array, mask=np.zeros_like(array, dtype='bool'))

Кажется дублирующая ссылка на array ненужный и неуклюжий. Если вы не укажете параметр mask=, маской по умолчанию будет скалярное логическое значение, которое предотвращает частичный доступ к маске.

1 Ответ

2 голосов
/ 26 марта 2020

Вы должны иметь возможность просто установить маску в False:

>>> array = np.array([1,2,3])
>>> masked_array = np.ma.masked_array(array, mask=False)
>>> masked_array
masked_array(data = [1 2 3],
             mask = [False False False],
       fill_value = 999999)

Я видел комментарий hpaulj и поиграл с различными способами решения этой проблемы и сравнения производительности. Я не могу объяснить разницу, но @hpaulj, похоже, гораздо глубже понимает, как работает numpy. Любая информация о том, почему m3 () выполняется намного быстрее, была бы наиболее ценной.

def origM():
    array = np.array([1,2,3])
    return np.ma.masked_array(array, mask=np.zeros_like(array, dtype='bool'))

def m():
    array = np.array([1,2,3])
    return np.ma.masked_array(array, mask=False)    

def m2():
    array = np.array([1,2,3])
    m = np.ma.masked_array(array)
    m.mask = False
    return m

def m3():
    array = np.array([1,2,3])
    m = array.view(np.ma.masked_array)
    m.mask = False
    return m

>>> origM()
masked_array(data = [1 2 3],
             mask = [False False False],
       fill_value = 999999)

Все четыре возвращают одинаковый результат:

>>> m()
masked_array(data = [1 2 3],
             mask = [False False False],
       fill_value = 999999)

>>> m2()
masked_array(data = [1 2 3],
             mask = [False False False],
       fill_value = 999999)

>>> m3()
masked_array(data = [1 2 3],
             mask = [False False False],
       fill_value = 999999)

м3 () выполняет самый быстрый:

>>> timeit.timeit(origM, number=1000)
0.024451958015561104
>>> timeit.timeit(m, number=1000)
0.0393978749634698
>>> timeit.timeit(m2, number=1000)
0.024049583997111768
>>> timeit.timeit(m3, number=1000)
0.018082750029861927
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...