Метод numpy.ma (masked) имеет средние значения несоответствующего типа

Я заметил, что метод numpy masked-array mean возвращает разные типы, когда он, вероятно, не должен:

import numpy as np A = np.ma.masked_equal([1,1,0], value=0) B = np.ma.masked_equal([1,1,1], value=0) # no masked values type(A.mean()) #numpy.float64 type(B.mean()) #numpy.ma.core.MaskedArray 

Другие методы numpy.ma.core.MaskedArray кажутся согласованными

 type( A.sum()) == type(B.sum()) # True type( A.prod()) == type(B.prod()) # True type( A.std()) == type(B.std()) # True type( A.mean()) == type(B.mean()) # False 

Может кто-нибудь объяснить это?

ОБНОВЛЕНИЕ: Как указано в комментариях

 C = np.ma.masked_array([1, 1, 1], mask=[False, False, False]) type(C.mean()) == type(A.mean()) # True 

  • Сравнивая массивы NumPy так, чтобы NaN сравнивали равные
  • Возьмите несколько списков в dataframe
  • Входные и выходные массивы numpy для h5py
  • Использование Cython для переноса шаблона c ++ для принятия любого массива numpy
  • Сравнение с «Нет» приведет к созданию элементарного объекта
  • Получить координаты локальных максимумов в 2D-массиве выше определенного значения
  • One Solution collect form web for “Метод numpy.ma (masked) имеет средние значения несоответствующего типа”

    B.mask начинается с:

      if self._mask is nomask: result = super(MaskedArray, self).mean(axis=axis, dtype=dtype) 

    np.ma.nomaskFalse .

    Это относится к вашему B :

     masked_array(data = [1 1 1], mask = False, fill_value = 0) 

    Для A маска представляет собой массив, который соответствует data в размере. В B это скаляр, False и mean что это особый случай.

    Мне нужно копать немного больше, чтобы понять, что это значит.

     In [127]: np.mean(B) Out[127]: masked_array(data = 1.0, mask = False, fill_value = 0) In [141]: super(np.ma.MaskedArray,B).mean() Out[141]: masked_array(data = 1.0, mask = False, fill_value = 0) 

    Я не уверен, что помогает; существует некоторая циклическая ссылка между методами np.ndarray и np функцией и методами np.ma , что затрудняет точное определение того, какой код используется. Это похоже на использование скомпилированного mean метода, но не очевидно, как это обрабатывает маскирование.

    Интересно, стоит ли использовать

      np.mean(B.data) # or B.data.mean() 

    и super метода не является правильным подходом.

    В любом случае один и тот же массив, но с векторной маской возвращает скаляр.

     In [132]: C Out[132]: masked_array(data = [1 1 1], mask = [False False False], fill_value = 0) In [133]: C.mean() Out[133]: 1.0 

    ====================

    nomask этот метод без ярлыка nomask , вызывает ошибку после

      dsum = self.sum(axis=axis, dtype=dtype) cnt = self.count(axis=axis) if cnt.shape == () and (cnt == 0): result = masked else: result = dsum * 1. / cnt 

    self.count возвращает скаляр в случае nomask , но np.int32 в регулярной маскировке. Таким образом, cnt.shape задыхается.

    trace – единственный другой маскированный метод, который пытается использовать этот super(MaskedArray...) . Очевидно, что что-то клочковое о среднем коде.

    ====================

    Актуальная проблема с ошибкой: https://github.com/numpy/numpy/issues/5769

    В соответствии с этим тот же вопрос был поднят здесь в прошлом году: Тестирование эквивалентности средств экземпляров Numpy MaskedArray повышает ошибку атрибута

    Похоже, что есть много проблем маскировки, а не только со mean . В настоящее время могут быть исправления в мастере разработки или в ближайшем будущем.

    Python - лучший язык программирования в мире.