Stellen Sie nur sicher, dass Sie nicht np.infoder np.nanin Ihrem Array haben, da sie überraschende Ergebnisse haben. Zum Beispiel np.array([np.inf]).astype(int)Ausgänge array([-9223372036854775808]).
Garrett
Auf meinem Rechner np.array([np.inf]).astype(int), np.array([-np.inf]).astype(int)und np.array([np.nan]).astype(int)alle die gleiche Sache zurück. Warum?
BallpointBen
1
@BallpointBen: nanund infsind Gleitkommawerte und können nicht sinnvoll in int konvertiert werden. Wie der Kommentar vor Ihnen bemerkt, wird es überraschendes Verhalten geben, und ich denke nicht, dass das genaue Verhalten genau definiert ist. Wenn Sie zuordnen möchten nanund infauf bestimmte Werte, müssen Sie das selbst tun.
BrenBarn
Beachten Sie, dass x.astype (int) [0] [0] nicht vom Typ ist int. Es ist numpy.int32.
Chris Anderson
Beachten Sie, dass die Antwort von @ fhtuft, obwohl dies das Array in Ints konvertiert, zu weniger Überraschungen führen kann
Nathan Musoke,
66
Einige Numpy-Funktionen zur Steuerung der Rundung: Rint , Boden , Stumpf , Decke . je nachdem, wie Sie die Schwimmer abrunden möchten, nach oben, unten oder auf den nächsten int.
>>> x = np.array([[1.0,2.3],[1.3,2.9]])>>> x
array([[1.,2.3],[1.3,2.9]])>>> y = np.trunc(x)>>> y
array([[1.,2.],[1.,2.]])>>> z = np.ceil(x)>>> z
array([[1.,3.],[2.,3.]])>>> t = np.floor(x)>>> t
array([[1.,2.],[1.,2.]])>>> a = np.rint(x)>>> a
array([[1.,2.],[1.,3.]])
Um eines davon in int oder einen der anderen Typen in numpy, astype (wie von BrenBern beantwortet) zu machen:
Genau das, wonach ich gesucht habe. astypeist oft zu allgemein und ich denke, es ist wahrscheinlich nützlicher, wenn intx-inty-Konvertierungen durchgeführt werden. Wenn ich eine Float-Int-Konvertierung durchführen möchte, ist es eine nette Funktion, die Art der Rundung auswählen zu können.
Bakuriu
11
Der einfachste Weg, um Fast-Ints sicher in Ints wie 7.99999umzuwandeln 8, ist np.rint(arr).astype(int)?
Endolith
irgendwie in numpy, um es uint8 zu machen?
Ryan
2
@ Ryanastype(np.uint8)
Chris Anderson
14
Sie können verwenden np.int_:
>>> x = np.array([[1.0,2.3],[1.3,2.9]])>>> x
array([[1.,2.3],[1.3,2.9]])>>> np.int_(x)
array([[1,2],[1,2]])
Wenn das Eingabearray bereits den richtigen dtype hat, wird asarraydie Array-Kopie vermieden, solange astypedies nicht der Fall ist (sofern Sie nichts anderes angeben copy=False):
>>> a = np.array([1,2,3,4])>>> a is np.asarray(a)# no copy :)True>>> a is a.astype(int)# copy :(False>>> a is a.astype(int, copy=False)# no copy :)True
np.inf
odernp.nan
in Ihrem Array haben, da sie überraschende Ergebnisse haben. Zum Beispielnp.array([np.inf]).astype(int)
Ausgängearray([-9223372036854775808])
.np.array([np.inf]).astype(int)
,np.array([-np.inf]).astype(int)
undnp.array([np.nan]).astype(int)
alle die gleiche Sache zurück. Warum?nan
undinf
sind Gleitkommawerte und können nicht sinnvoll in int konvertiert werden. Wie der Kommentar vor Ihnen bemerkt, wird es überraschendes Verhalten geben, und ich denke nicht, dass das genaue Verhalten genau definiert ist. Wenn Sie zuordnen möchtennan
undinf
auf bestimmte Werte, müssen Sie das selbst tun.int
. Es istnumpy.int32
.Einige Numpy-Funktionen zur Steuerung der Rundung: Rint , Boden , Stumpf , Decke . je nachdem, wie Sie die Schwimmer abrunden möchten, nach oben, unten oder auf den nächsten int.
Um eines davon in int oder einen der anderen Typen in numpy, astype (wie von BrenBern beantwortet) zu machen:
quelle
astype
ist oft zu allgemein und ich denke, es ist wahrscheinlich nützlicher, wenn intx-inty-Konvertierungen durchgeführt werden. Wenn ich eine Float-Int-Konvertierung durchführen möchte, ist es eine nette Funktion, die Art der Rundung auswählen zu können.7.99999
umzuwandeln8
, istnp.rint(arr).astype(int)
?astype(np.uint8)
Sie können verwenden
np.int_
:quelle
Wenn Sie sich nicht sicher , ob Ihre Eingabe ein Numpy Array sein werden, können Sie
asarray
mitdtype=int
stattastype
:Wenn das Eingabearray bereits den richtigen dtype hat, wird
asarray
die Array-Kopie vermieden, solangeastype
dies nicht der Fall ist (sofern Sie nichts anderes angebencopy=False
):quelle