Используйте val.item()
для преобразования большинства значений NumPy в собственный тип Python:
import numpy as np
# for example, numpy.float32 -> python float
val = np.float32(0)
pyval = val.item()
print(type(pyval)) # <class 'float'>
# and similar...
type(np.float64(0).item()) # <class 'float'>
type(np.uint32(0).item()) # <class 'long'>
type(np.int16(0).item()) # <class 'int'>
type(np.cfloat(0).item()) # <class 'complex'>
type(np.datetime64(0, 'D').item()) # <class 'datetime.date'>
type(np.datetime64('2001-01-01 00:00:00').item()) # <class 'datetime.datetime'>
type(np.timedelta64(0, 'D').item()) # <class 'datetime.timedelta'>
...
(Другой способ np.asscalar(val)
, однако, он устарел, начиная с NumPy 1.16).
Для любопытных, чтобы построить таблицу преобразований скалярных массивов NumPy для вашей системы:
for name in dir(np):
obj = getattr(np, name)
if hasattr(obj, 'dtype'):
try:
if 'time' in name:
npn = obj(0, 'D')
else:
npn = obj(0)
nat = npn.item()
print('{0} ({1!r}) -> {2}'.format(name, npn.dtype.char, type(nat)))
except:
pass
Есть несколько типов Numpy , которые не имеют родной эквивалента Python на некоторых системах, в том числе: clongdouble
, clongfloat
, complex192
, complex256
, float128
, longcomplex
, longdouble
и longfloat
. Они должны быть преобразованы в ближайший эквивалент NumPy перед использованием .item()
.
np.str
- это не тип Numpy, то естьnp.str is str
просто псевдоним стандартного типа Python. То же самое сnp.float
,np.int
,np.bool
,np.complex
, иnp.object
. Типы Numpy имеют трейлинг_
, напримерnp.str_
.np.float64(0).item()
а такжеnp.float(0).item()
. Другими словами, для случаев, когда известно, что делать, поддерживайте.item()
метод, даже если он просто возвращает то же значение. Таким образом, я мог бы применить.item()
к гораздо более грубым скалярам без специального кожуха. Как таковые, казалось бы, параллельные концепции отличаются из-за базовой реализации. Я полностью понимаю, почему это было сделано. Но это раздражает пользователя библиотеки.я обнаружил, что смешал набор типов numpy и стандартный python. как все numy-типы происходят из
numpy.generic
, вот как вы можете конвертировать все в стандартные типы Python:источник
np.asscalar()
. Зачем? Вероятно, без видимых на то причин. Несмотря на десятилетнюю относительную стабильность, API-интерфейс NumPy в настоящее время является нестабильной движущейся целью, требующей постоянного обслуживания от последующих приложений. По крайней мере, они оставили намitem()
метод ... пока.if isinstance(o, numpy.generic): return o.item() raise TypeError
и он снова превратится в неутешительный ответ: DЕсли вы хотите преобразовать (numpy.array ИЛИ numpy скаляр ИЛИ собственный тип ИЛИ numpy.darray) в собственный тип, вы можете просто сделать:
Tolist преобразует ваш скаляр или массив в нативный тип Python. Лямбда-функция по умолчанию заботится о случае, когда значение уже является нативным.
источник
lambda: value
поскольку мы не хотим никаких входных данных.getattr
+tolist
комбо не только универсальное, но даже векторизованное! (unlinke .item ())Как насчет:
источник
np.dtype('mint8')
для любого положительного целого числаm
. Не может быть исчерпывающего картирования. (Я также не верю, что для этого преобразования есть встроенная функция. Я могу ошибаться, но я так не думаю :))>>> print([numpy.asscalar(x) for x in numpy.linspace(1.0, 0.0, 21)]) [1.0, 0.95, 0.9, 0.85, 0.8, 0.75, 0.7, 0.6499999999999999, 0.6, 0.55, 0.5, 0.44999999999999996, 0.3999999999999999, 0.35, 0.29999999999999993, 0.25, 0.19999999999999996, 0.1499999999999999, 0.09999999999999998, 0.04999999999999993, 0.0]
как видите, не все значения были правильно преобразованы.>>> print([numpy.asscalar(round(x,2)) for x in numpy.linspace(1.0, 0.0, 21)]) [1.0, 0.95, 0.9, 0.85, 0.8, 0.75, 0.7, 0.65, 0.6, 0.55, 0.5, 0.45, 0.4, 0.35, 0.3, 0.25, 0.2, 0.15, 0.1, 0.05, 0.0]
tolist()
это более общий подход для достижения этой цели. Он работает в любом примитивном dtype, а также в массивах или матрицах.Я на самом деле не выдает список, если вызывается из примитивных типов:
numpy == 1.15.2
источник
Вы также можете вызвать
item()
метод объекта, который хотите преобразовать:источник
Я думаю, что вы можете просто написать общую функцию преобразования типа следующим образом:
Это означает, что нет фиксированных списков, и ваш код будет масштабироваться с большим количеством типов.
источник
numpy.ndarray
с нулем в нем, используя функциюzeros()
вызоваndarrays
tolist()
функции для преобразования в нативные типы. Однажды в нативных типах я прошу тип вернуть его.tolist()
является функциейndarray
grep -r 'tolist' numpy
. (все еще в процессе, NumPy является массивным!)Numpy содержит эту информацию в отображении,
typeDict
так что вы можете сделать что-то вроде ниже:Если вы хотите фактические типы Python, а не их имена, вы можете сделать ::
источник
Извините, что опоздал на часть, но я смотрел на проблему преобразования только
numpy.float64
в обычный Pythonfloat
. Я видел 3 способа сделать это:npValue.item()
npValue.astype(float)
float(npValue)
Вот соответствующие сроки от IPython:
Похоже,
float(npValue)
кажется, гораздо быстрее.источник
Мой подход немного силен, но, похоже, подходит для всех случаев:
Использование:
источник
Дополнительное замечание о скалярных массивах для тех, кто не нуждается в автоматическом преобразовании и знает numpy dtype значения:
Источник
Таким образом, в большинстве случаев преобразование может вообще не понадобиться, и скалярный массив можно использовать напрямую. Эффект должен быть идентичным использованию скаляра Python:
Но если по какой-то причине необходимо явное преобразование, используйте соответствующую встроенную функцию Python. Как показано в другом ответе, он также быстрее скалярного
item()
метода массива .источник
Переведите весь ndarray вместо одного объекта данных:
Тем не менее, это занимает несколько минут при обработке больших кадров данных. Я также ищу более эффективное решение. Надеюсь на лучший ответ.
источник