Wie konvertiere ich ein 2D Float Numpy Array in ein 2D Int Numpy Array?


302

Wie konvertiere ich ein echtes Numpy-Array in ein int-Numpy-Array? Versucht, Map direkt auf Array zu verwenden, aber es hat nicht funktioniert.

Antworten:


405

Verwenden Sie die astypeMethode.

>>> x = np.array([[1.0, 2.3], [1.3, 2.9]])
>>> x
array([[ 1. ,  2.3],
       [ 1.3,  2.9]])
>>> x.astype(int)
array([[1, 2],
       [1, 2]])

30
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:

a.astype(int)
array([[1, 2],
       [1, 3]])

>>> y.astype(int)
array([[1, 2],
       [1, 2]])

2
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]])

12

Wenn Sie sich nicht sicher , ob Ihre Eingabe ein Numpy Array sein werden, können Sie asarraymit dtype=intstatt astype:

>>> np.asarray([1,2,3,4], dtype=int)
array([1, 2, 3, 4])

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.