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):
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]])
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
np.inf
aninp.nan
w swojej tablicy, ponieważ mają zaskakujące wyniki. Na przykładnp.array([np.inf]).astype(int)
wyjściaarray([-9223372036854775808])
.np.array([np.inf]).astype(int)
,np.array([-np.inf]).astype(int)
inp.array([np.nan]).astype(int)
wszystko powróci samo. Dlaczego?nan
iinf
są 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ćnan
iinf
pewne wartości, musisz to zrobić sam.int
. Jestnumpy.int32
.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.
Aby uczynić jedną z nich int, lub jednym z innych typów w numpy, astype (zgodnie z odpowiedzią BrenBern):
źródło
astype
jest 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ą.7.99999
ints like8
, jestnp.rint(arr).astype(int)
?astype(np.uint8)
możesz użyć
np.int_
:źródło
Jeśli nie jesteś pewien, Twój wkład będzie tablicę NumPy, można skorzystać
asarray
zedtype=int
zamiastastype
:Jeśli tablica wejściowa ma już prawidłowy typ,
asarray
unika kopiowania tablicy, dopóki jejastype
nie ma (chyba że określonocopy=False
):źródło