2014-01-10 2 views
2

ufunc.reduce для numpy.bitwise_and.reduce, похоже, не ведет себя правильно ... я неправильно его использую?numpy.bitwise_and.reduce ведет себя неожиданно?

>>> import numpy as np 
>>> x = [0x211f,0x1013,0x1111] 
>>> np.bitwise_or.accumulate(x) 
array([ 8479, 12575, 12575]) 
>>> np.bitwise_and.accumulate(x) 
array([8479, 19, 17]) 
>>> '%04x' % np.bitwise_or.reduce(x) 
'311f' 
>>> '%04x' % np.bitwise_and.reduce(x) 
'0001' 

Результат reduce() должен быть последним значением accumulate() и это не так. Что мне здесь не хватает?

На данный момент, я могу обойти с помощью идентичности де Моргана (замена OR и AND, и инвертирующий вход и выход):

>>> ~np.bitwise_or.reduce(np.invert(x)) 
17 
+0

Начиная с версии 1.12.0 вы должны увидеть правильное значение (-1) для идентификатора 'np.bitwise_and'. См. [PR # 7373] (https://github.com/numpy/numpy/pull/7373). Кстати, очень круто обходное решение! –

ответ

2

Согласно документации предоставленной вами, ufunc.reduce использует op.identity в качестве начального значения ,

numpy.bitwise_and.identity является 1, а не 0xffffffff.... или -1.

>>> np.bitwise_and.identity 
1 

Так numpy.bitwise_and.reduce([0x211f,0x1013,0x1111]) эквивалентно:

>>> np.bitwise_and(np.bitwise_and(np.bitwise_and(1, 0x211f), 0x1013), 0x1111) 
1 
>>> 1 & 0x211f & 0x1013 & 0x1111 
1 

>>> -1 & 0x211f & 0x1013 & 0x1111 
17 

Там, кажется, нет никакого способа, чтобы указать начальное значение в соответствии с документацией. (в отличие от встроенной функции Python reduce)

+1

Ах, понял. Благодарю. Стыдно ufunc.reduce не допускает явного аргумента начального значения. –

+0

@JasonS, да, было бы хорошо, если бы 'ufunc.reduce' позволило нам указать начальное значение. – falsetru

+0

Это изменилось за последние пару лет? –

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