Просто убедитесь, что у вас нет np.infили np.nanв вашем массиве, так как они имеют удивительные результаты. Например, np.array([np.inf]).astype(int)выводы array([-9223372036854775808]).
Гарретт
На моей машине np.array([np.inf]).astype(int), np.array([-np.inf]).astype(int)и np.array([np.nan]).astype(int)возвращает то же самое. Зачем?
BallpointBen
1
@BallpointBen: nanи infявляются значениями с плавающей точкой, и их невозможно преобразовать в int. Как говорится в комментарии перед вашими замечаниями, поведение будет удивительным, и я не думаю, что точное поведение четко определено. Если вы хотите сопоставить nanи infопределенные значения, вы должны сделать это самостоятельно.
BrenBarn
Обратите внимание, что x.astype (int) [0] [0] не относится к типу int. Это numpy.int32.
Крис Андерсон
Обратите внимание, что хотя это и преобразует массив в целые, ответ @ fhtuft может привести к меньшему количеству сюрпризов
Натан Мусоке
66
Некоторые функции numpy для контроля округления: rint , floor , trunc , ceil . в зависимости от того, как вы хотите округлить поплавки, вверх, вниз или до ближайшего целого.
>>> 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.]])
Чтобы сделать одно из этого в int или один из других типов в numpy, astype (как ответил BrenBern):
Именно то, что я искал. astypeчасто является слишком общим, и я думаю, что это, вероятно, более полезно при выполнении intx - inty преобразований. Когда я хочу сделать преобразование с плавающей точкой в int, возможность выбрать тип округления является хорошей особенностью.
Бакуриу
11
Поэтому самый простой способ безопасно конвертировать почти Интс как 7.99999в Интс нравится 8, это np.rint(arr).astype(int)?
эндолит
Как-нибудь в NumPy сделать это Uint8?
Райан
2
@Ryanastype(np.uint8)
Крис Андерсон
15
Вы можете использовать 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]])
Если входной массив уже имеет правильный тип d, asarrayизбегает копирования массива, пока astypeнет (если вы не укажете 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
илиnp.nan
в вашем массиве, так как они имеют удивительные результаты. Например,np.array([np.inf]).astype(int)
выводыarray([-9223372036854775808])
.np.array([np.inf]).astype(int)
,np.array([-np.inf]).astype(int)
иnp.array([np.nan]).astype(int)
возвращает то же самое. Зачем?nan
иinf
являются значениями с плавающей точкой, и их невозможно преобразовать в int. Как говорится в комментарии перед вашими замечаниями, поведение будет удивительным, и я не думаю, что точное поведение четко определено. Если вы хотите сопоставитьnan
иinf
определенные значения, вы должны сделать это самостоятельно.int
. Этоnumpy.int32
.Некоторые функции numpy для контроля округления: rint , floor , trunc , ceil . в зависимости от того, как вы хотите округлить поплавки, вверх, вниз или до ближайшего целого.
Чтобы сделать одно из этого в int или один из других типов в numpy, astype (как ответил BrenBern):
источник
astype
часто является слишком общим, и я думаю, что это, вероятно, более полезно при выполнении intx - inty преобразований. Когда я хочу сделать преобразование с плавающей точкой в int, возможность выбрать тип округления является хорошей особенностью.7.99999
в Интс нравится8
, этоnp.rint(arr).astype(int)
?astype(np.uint8)
Вы можете использовать
np.int_
:источник
Если вы не уверены , что ваш вклад будет массив Numpy, вы можете использовать
asarray
сdtype=int
вместоastype
:Если входной массив уже имеет правильный тип d,
asarray
избегает копирования массива, покаastype
нет (если вы не укажетеcopy=False
):источник