[PYTHON] Bitoperation einschließlich des Rückgabetyps und der Umwandlung von numpy.random.choice

Es ist eine Python3-Serie. Im Folgenden ist "int" also eine multiplizierte ganze Zahl.

Problem

Wir führen ein Bitboard ein, um den zuvor geschriebenen Umkehrartikel weiter zu bewerben. Da 8x8 = 64 Quadrate ist, wird es in 64 Bit ausgedrückt.

Ich wollte zufällig eine aus der "int" -Liste auswählen und eine Bitoperation mit der Karte ausführen, also schrieb ich im Allgemeinen den folgenden Code.

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

In [3]: board = 0xfffffffffffffff

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

Einer wird mit numpy.random.choice aus der Liste entfernt und eine Bitoperation ausgeführt. Haben Sie übrigens bemerkt, dass die Variable "board" nur 15 fs verwendet, dh den Bereich, der durch 60 Bit dargestellt werden kann? Da die Karte durch bis zu 64 Bit dargestellt wird, erhöhen Sie f um eins, um 64 Bit zu erhalten.

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''

Es scheint, dass ein Fehler auftritt, wenn die Anzahl der Bits von "Karte" 64 beträgt.

Ursache

Werfen wir einen Blick auf die Art dessen, was in np.random.choice erscheint.

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

array ist eine Liste von int, kommt aber als numpy.int64 heraus! Es scheint, dass numpy.int64 und 64bit int keine Bitoperationen ausführen können.

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''

Übrigens, als ich es überprüft habe, scheint es nicht möglich zu sein, ** auf 64-Bit int zu beschränken. was ist das.

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

Obwohl "Casting" irgendwie geschrieben ist, war das 63-Bit-Operationsergebnis "numpy.int64" und das 65-Bit-Operationsergebnis "int", daher weiß ich nicht, in was die 64-Bit-Grenze umgewandelt werden soll. Ist das so?

Problemumgehung

Da numpy.int64 und 64bit int nicht bitberechnet werden können, scheint es gut, in numpy.uint64 umzuwandeln.

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

Vielleicht sogar negative Zahlen.

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

In Anbetracht des ursprünglichen Board-Typs würde ich ihn gerne in "int" umwandeln, aber ich mache mir keine Sorgen über die Bit-Operation negativer Zahlen. Bei mehreren ganzen Zahlen bin ich mir nicht sicher.

Bonus-Postskriptum

Erstens ändert sich auch der Rückgabetyp von "np.random.choice" je nach Inhalt.

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

Zu gruselig

Recommended Posts

Bitoperation einschließlich des Rückgabetyps und der Umwandlung von numpy.random.choice
Überprüfen Sie den Linux-Verteilungstyp und die Version
Netmiko erkennt automatisch den Typ des Netzwerkgeräts und führt den Befehl aus
Die Geschichte von Python und die Geschichte von NaN
Über den Rückgabewert von pthread_mutex_init ()
Über den Rückgabewert des Histogramms.
Über den Grundtyp von Go
Dies und das der Einschlussnotation.
Überprüfen Sie das Konzept und die Terminologie der Regression
[Python] [Meta] Ist der Python-Typ ein Typ?
Die Geschichte, deep3d auszuprobieren und zu verlieren
[Python3] Grundlegendes zu Dateivorgängen
Ich habe den gleitenden Durchschnitt des IIR-Filtertyps mit Pandas und Scipy verglichen