Jak przekonwertować tablicę liczb zmiennoprzecinkowych 2D na tablicę liczb int 2D 2D?

302

Jak przekonwertować tablicę liczb rzeczywistych na tablicę liczb całkowitych int? Próbowałem użyć map bezpośrednio do tablicy, ale to nie działało.

Shan
źródło

Odpowiedzi:

404

Skorzystaj z astypemetody

>>> 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
źródło
30
Tylko upewnij się, że nie masz np.infani np.nanw swojej tablicy, ponieważ mają zaskakujące wyniki. Na przykład np.array([np.inf]).astype(int)wyjścia array([-9223372036854775808]).
Garrett,
Na moim komputerze np.array([np.inf]).astype(int), np.array([-np.inf]).astype(int)i np.array([np.nan]).astype(int)wszystko powróci samo. Dlaczego?
BallpointBen
1
@BallpointBen: nani infsą wartościami zmiennoprzecinkowymi i nie można ich znacząco przekonwertować na int. Jak zauważa komentarz przed twoimi, będzie zaskakujące zachowanie i nie sądzę, że dokładne zachowanie jest dobrze zdefiniowane. Jeśli chcesz zmapować nani infpewne wartości, musisz to zrobić sam.
BrenBarn
Zauważ, że x.astype (int) [0] [0] nie jest typu int. Jest numpy.int32.
Chris Anderson
Zauważ, że chociaż to konwertuje tablicę na ints, odpowiedź @ fhtuft, która może spowodować mniej niespodzianek
Nathan Musoke
66

Niektóre funkcje numpy do sterowania zaokrąglaniem: rint , floor , trunc , ceil . w zależności od tego, jak chcesz zaokrąglić liczbę zmiennoprzecinkową, w górę, w dół lub do najbliższej liczby całkowitej.

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

Aby uczynić jedną z nich int, lub jednym z innych typów w numpy, astype (zgodnie z odpowiedzią BrenBern):

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

>>> y.astype(int)
array([[1, 2],
       [1, 2]])
fhtuft
źródło
2
Dokładnie tego szukałem. astypejest często zbyt ogólna i myślę, że prawdopodobnie jest bardziej przydatna podczas konwersji typu intx. Kiedy chcę wykonać konwersję float - int, możliwość wyboru rodzaju zaokrąglania jest miłą cechą.
Bakuriu
11
Więc najprostszym sposobem na bezpieczną konwersję prawie-ints jak 7.99999ints like 8, jest np.rint(arr).astype(int)?
endolith,
jakikolwiek sposób na numpy, aby to uint8?
Ryan
2
@Ryanastype(np.uint8)
Chris Anderson
14

możesz użyć 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
źródło
12

Jeśli nie jesteś pewien, Twój wkład będzie tablicę NumPy, można skorzystać asarrayze dtype=intzamiast astype:

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

Jeśli tablica wejściowa ma już prawidłowy typ, asarrayunika kopiowania tablicy, dopóki jej astypenie ma (chyba że określono 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 ''
źródło