2016-03-16 3 views
4

Существует пакет numpy.testing для сравнения массивов numpy, но для маскированных массивов не существует эквивалента. Есть ли там библиотека, которая делает это уже?Есть ли библиотека, которая делает эквивалентность массива для numpy.ma?

Я заметил, что у numpy.ma есть некоторые функции сравнения, такие как numpy.ma.allequal, но эта функция, похоже, не проверяет, что обе маски массива идентичны. Например. -

In [151]: a = ma.masked_array([0,1,2,3],[True,False,False,False]) 

In [152]: b = ma.masked_array([0,1,2,3],[True,True,False,False]) 

In [153]: ma.allequal(a,b) 
Out[153]: True 
+0

'numpy.testing' не предназначен для сравнения массивов numpy; все, что связано со сравнением, есть метод assert, совершенно не подходящий для сравнений массивов общего назначения. – user2357112

+0

Какую семантику сравнения вы хотите, во всяком случае? По-видимому, вы хотите равных масок. Вы хотите получить равные значения? Точно равные элементы или до допуска? Идентичные типы? Идентичная макет памяти? Если ячейка маскируется в обоих массивах с маской, выполняются ли замаскированные значения в массиве данных? – user2357112

ответ

1

ma.masked_array.__eq__ фактически реализуется в NumPy, но, возможно, он не имеет семантику вы ищете? Вы можете получить в документации с help(ma.masked_array.__eq__) с переводчиком питона, в нем говорится:

Проверить, равен ли другой я поэлементно

Что я могу увидеть данный ваш пример: он делает сравнение, где данные отмечены как действительные и возвращают результат в поле данных маскированного массива. Везде, где данные были недействительными (для a или b) получившееся поле маскируемого массива маскируется.

>>> import numpy as np 
>>> import numpy.ma as ma 
>>> a = ma.masked_array([0,1,2,3],[True,False,False,False]) 
>>> b = ma.masked_array([0,1,2,3],[True,True,False,False]) 
>>> a==b 
masked_array(data = [-- -- True True], 
      mask = [ True True False False], 
     fill_value = True) 
>>> b = ma.masked_array([0,1,2,4],[True,True,False,False]) 
>>> a==b 
masked_array(data = [-- -- True False], 
      mask = [ True True False False], 
     fill_value = True) 

Если вы хотите проверки, что все поля являются действительными и равными вы могли бы использовать:

np.allfalse ((а == б) .data)

редактировать: на самом деле, я думаю, вам нужно будет:

not np.any((a==b).mask) and np.alltrue((a==b).compressed()) 

Если вы ва нт в проверки, что все допустимые поля равны вы могли бы использовать:

np.alltrue((a==b).compressed()) 

Как user2357112 объяснил в комментариях, numpy.testing предоставляет функции для модульного тестирования на Numpy массивов, которые не могут быть то, что вы ищете. Это так, вы могли бы использовать обычную функцию assert с примерами, которые я предоставил.

 Смежные вопросы

  • Нет связанных вопросов^_^