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.

Shan
quelle

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]])
BrenBarn
quelle
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]])
fhtuft
quelle
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]])
Hackaholic
quelle
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
1 ''
quelle