Opération sur les bits comprenant le type de retour et le cast de numpy.random.choice

C'est une série Python3. Donc, dans ce qui suit, ʻint` est un entier multiplié.

problème

Nous introduisons un petit tableau pour promouvoir davantage l'article de reversi que j'ai écrit plus tôt. Puisque 8x8 = 64 carrés, il est exprimé en 64 bits.

Je voulais en sélectionner un au hasard dans la liste de ʻint` et effectuer une opération de bit avec la carte, j'ai donc écrit le code suivant.

In [2]: array = [1, 2, 3]

In [3]: board = 0xfffffffffffffff

In [4]: np.random.choice(array) & board
Out[4]: 2

L'un est retiré de la liste avec numpy.random.choice et l'opération sur les bits est effectuée. Au fait, avez-vous remarqué que la variable «board» n'utilise que 15 fs, c'est-à-dire la plage qui peut être représentée par 60 bits? Puisque la carte est représentée par jusqu'à 64 bits, essayez d'augmenter f par un pour en faire 64 bits.

In [5]: array = [1, 2, 3]

In [6]: board = 0xffffffffffffffff

In [7]: np.random.choice(array) & board
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-cb36edc17d23> in <module>()
----> 1 np.random.choice(array) & board

TypeError: ufunc 'bitwise_and' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

Il semble qu'une erreur se produise si le nombre de bits de «board» est de 64.

Cause

Jetons un coup d'oeil au type de ce qui apparaît dans np.random.choice.

In [36]: type(np.random.choice(array))
Out[36]: numpy.int64

ʻArray est une liste de ʻint, mais elle se présente sous la forme numpy.int64! Il semble que numpy.int64 et 64bit ʻint` ne peuvent pas effectuer d'opérations sur les bits.

In [49]: np.int64(1) & board
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-49-3927f8b2d3d4> in <module>()
----> 1 np.int64(1) & board

TypeError: ufunc 'bitwise_and' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

Au fait, quand je l'ai vérifié, il semble qu'il n'est pas possible de ** limiter ** à ʻint` 64 bits. Qu'est-ce que c'est.

In [24]: board = 0b111111111111111111111111111111111111111111111111111111111111111  # 63bit

In [25]: np.random.choice(array) & board
Out[25]: 1

In [26]: board = 0b1111111111111111111111111111111111111111111111111111111111111111  # 64bit

In [27]: np.random.choice(array) & board---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-27-cb36edc17d23> in <module>()
----> 1 np.random.choice(array) & board

TypeError: ufunc 'bitwise_and' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

In [28]: board = 0b11111111111111111111111111111111111111111111111111111111111111111  # 65bit

In [29]: np.random.choice(array) & board
Out[29]: 3

Bien que «casting» soit en quelque sorte écrit, le résultat de l'opération 63 bits était «numpy.int64», et le résultat de l'opération 65 bits était «int », donc je ne sais pas vers quoi transtyper la limite 64 bits. Est-ce vrai?

solution de contournement

Puisque numpy.int64 et 64bit ʻint ne peuvent pas être opérés sur les bits, il semble bon de convertir en numpy.uint64`.

In [55]: np.uint64(np.random.choice(array)) & board
Out[55]: 1

Peut-être même des nombres négatifs.

In [24]: np.uint64(-1)
Out[24]: 18446744073709551615

Compte tenu du type de carte d'origine, je voudrais le convertir en «int», mais je ne suis pas inquiet du fonctionnement des bits des nombres négatifs. Je ne suis pas sûr de plusieurs entiers.

PostScript bonus

En premier lieu, le type de retour de np.random.choice change également en fonction du contenu.

In [13]: type(np.random.choice([1]))
Out[13]: numpy.int64

In [14]: type(np.random.choice([1<<63]))
Out[14]: numpy.uint64

In [15]: type(np.random.choice([1<<64]))
Out[15]: int

Trop effrayant

Recommended Posts

Opération sur les bits comprenant le type de retour et le cast de numpy.random.choice
Vérifiez le type et la version de la distribution Linux
Netmiko détecte automatiquement le type de périphérique réseau et exécute la commande
L'histoire de Python et l'histoire de NaN
À propos de la valeur de retour de pthread_mutex_init ()
À propos de la valeur de retour de l'histogramme.
À propos du type de base de Go
Ceci et celui de la notation d'inclusion.
Revoir le concept et la terminologie de la régression
[python] [meta] Le type de python est-il un type?
L'histoire d'essayer deep3d et de perdre
[Python3] Comprendre les bases des opérations sur les fichiers
J'ai comparé la moyenne mobile du type de filtre IIR avec les pandas et scipy