Возвращаемый тип numpy.minimum ()? - PullRequest
3 голосов
/ 07 апреля 2011

Когда я использую функции numpy minimum() и maximum() для логических массивов, тип результата печатается как numpy.int32. Однако сравнение с типом numpy.int32 не удается (даже после приведения). Это ошибка?

g = np.ones((5, 5), dtype = np.bool)
h = np.maximum(g, 4)
i = np.int32(h)

print 'type of g ', g.dtype.type   # prints <type 'numpy.bool_'>
print 'type of h ', h.dtype.type   # prints <type 'numpy.int32'>
print 'type of i ', i.dtype.type   # prints <type 'numpy.int32'>

print h.dtype.type == i.dtype.type # prints True
print h.dtype.type == np.int32     # prints False
print i.dtype.type == np.int32     # prints False
print i.dtype.type == np.bool_     # prints False

Ответы [ 5 ]

3 голосов
/ 07 апреля 2011

Мне кажется достаточно нормальным.Использование np.maximum возвращает максимум g и 4, что составляет 4 (True == 1).Вы получаете матрицу, полную четверок, которая является целочисленным типом.

Если вы используете этот синтаксис для сравнения типов, они работают: h.dtype.type == np.dtype(np.int32) или, проще, h.dtype == np.int32.

2 голосов
/ 07 апреля 2011

Тип возвращаемого значения: массив :

numpy.minimum (x1, x2 [, out])

Поэлементный минимум элементов массива.

Сравните два массива и возвращает новый массив, содержащий поэлементные минимумы. Если один из сравниваемых элементов - это nan, то этот элемент возвращается. Если оба элемента являются nans, возвращается первый. Последнее различие важно для сложных нанов, которые определяются как, по крайней мере, одна из действительных или мнимых частей, являющаяся наном. Чистый эффект состоит в том, что nans размножаются.

Параметры:
x1, x2: массив_подобный Массивы, содержащие элементы для сравнения. Они должны иметь одинаковую форму или формы, которые можно транслировать в одну форму. Возвращает:
y: {ndarray, скалярный} Минимум x1 и x2 поэлементно. Возвращает скаляр, если x1 и x2 являются скалярами.

От: http://docs.scipy.org/doc/numpy/reference/generated/numpy.minimum.html?highlight=minimum#numpy.minimum

1 голос
/ 08 апреля 2011

Проблема в том, что в C есть два целочисленных типа: int и long, и они могут быть 32-разрядными на 32-разрядных платформах.Текущая реализация в Numpy создает отдельный скалярный тип для обоих.Эти два обрабатываются одинаково в dtype сравнениях, когда они имеют одинаковый размер (dtypes - дескрипторы для содержимого массивов - отдельно от скалярных типов).Тем не менее тот факт, что на самом деле существует два 32-битных целочисленных скалярных типа, обнаруживается, если вы сравниваете скалярные типы напрямую.

Да, это немного сбивает с толку и, вероятно, будет исправлено в какой-то момент.

Однако при сравнении int == np.int32 вы столкнетесь с той же проблемой.Правильный способ - сравнивать dtypes, а не скалярные типы.

1 голос
/ 07 апреля 2011

Если вы читаете документацию для np.maximum, вы знаете, что она сравнивает два массива или, в вашем случае, массив и скаляр. Таким образом, он вернет 4 для каждого элемента г.

0 голосов
/ 07 апреля 2011

Это странно .. Я думаю, что происходит что-то странное.Хотя я замечаю, что

h.dtype == np.int32 # True

...