numpy.bitwise_and.réduire se comporter de façon inattendue?
-
22-12-2019 - |
Question
L' ufunc.reduce
pour numpy.bitwise_and.réduire ne semble pas se comporter correctement...suis-je utiliser?
>>> 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'
Le résultat de reduce()
devrait être la dernière valeur de accumulate()
et il n'est pas.Ce qui me manque ici?
Pour le moment, je peux contourner en utilisant DeMorgan identité (échange OU et ET, et l'entrée inverseuse et la sortie):
>>> ~np.bitwise_or.reduce(np.invert(x))
17
La solution
Selon les documents que vous avez fournis, ufunc.reduce
utilise op.identity
comme une valeur initiale.
numpy.bitwise_and.identity
est 1
, pas 0xffffffff....
ni -1
.
>>> np.bitwise_and.identity
1
Donc numpy.bitwise_and.reduce([0x211f,0x1013,0x1111])
est équivalent à:
>>> np.bitwise_and(np.bitwise_and(np.bitwise_and(1, 0x211f), 0x1013), 0x1111)
1
>>> 1 & 0x211f & 0x1013 & 0x1111
1
>>> -1 & 0x211f & 0x1013 & 0x1111
17
Il semble y avoir aucun moyen de spécifier la valeur initiale conformément à la documentation.(contrairement à Python builtin fonction reduce
)