numpy.bitwise_and.reduce ведет себя неожиданно?

ufunc.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() и это не так. Что мне здесь не хватает?

На данный момент я могу обойти, используя идентификатор DeMorgan (поменять местами OR и AND и инвертировать ввод и вывод):

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

1 ответ

Решение

Согласно предоставленной вами документации, 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)

Другие вопросы по тегам