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.

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

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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.