Как Numpy выводит dtype для массива
Может ли кто-нибудь помочь мне понять, откуда функция массива Numpy выводит тип данных.
Я понимаю, что он в основном выводит из вида значения, которое было присвоено массиву.
Например:
> data = [1,2,3,4]
> arr = np.array(data)
Таким образом, в приведенных выше строках "arr" будет иметь
dtype('int64') или dtype('int32').Я пытаюсь понять, как он решает, давать ли ему
int64 или int32?Я понимаю, что это может быть тривиальный вопрос, но я просто ... пытаясь понять, как это работает, как меня недавно спросили об этом в интервью.
4 ответов:
Per The docs,
Таким образом, на 32-битных машинахНекоторые типы, такие как int и intp, имеют различные разряды, зависящие от платформ (например, 32-битные и 64-битные машины).
np.array([1,2,3,4])возвращает массив dtypeint32, но на 64-битных машинах он возвращает массив dtypeint64.
К числовым типам данных относятся целые числа и числа с плавающей точкой.
Если у нас есть массив, содержащий как
integers, так иfloating point numbers,numpyприсвоит всему массиву тип данныхfloat, чтобы десятичные точки не терялись.Целое число никогда не будет иметь десятичной точки. Так, например, 2.55 будет храниться как 2
Как упоминалось @unutbu
int32иint64зависит от типа имеющихся у вас битовых машин, будь то 32-битная машина или 64-битная машина
Strings, есть значения, содержащиеnumbersи / илиcharacters. Например, строка может быть словом, предложением или несколькими предложениями. Самый общийdtype=stringбудет назначен вашему массиву, если Ваш массив имеет смешанные типы (числа и строки).Чтобы получить полный подробный обзор, вы можете посмотреть на этот веб-сайт scipy docs
В Python3 (и базовой 32-битной машине) int32 v int64 зависит от размера входного сигнала
In [447]: np.array(123456789) Out[447]: array(123456789) In [448]: _.dtype Out[448]: dtype('int32') In [449]: np.array(12345678901234) Out[449]: array(12345678901234, dtype=int64)Из документов
np.array:Dtype: требуемый тип данных для массива. Если не дано, то тип будет определен как минимальный требуемый тип. чтобы удерживать объекты в определенной последовательности. Этот аргумент может только используется для "апкаста" массива.
Похоже, что
int32- это наименьший размер int по умолчанию (по крайней мере, в моей конфигурации). То есть также значениеnp.int_.В качестве примера запрещенного понижения:
In [456]: np.array(12345678901234, dtype=np.int32) --------------------------------------------------------------------------- OverflowError Traceback (most recent call last) <ipython-input-456-da7c96e4b0b3> in <module>() ----> 1 np.array(12345678901234, dtype=np.int32) OverflowError: Python int too large to convert to C long
Я думаю, что существует своего рода иерархическая обработка, где она использует самый консервативный, но также всеобъемлющий тип, который может "юридически" представлять входные данные. Если у вас есть только целые числа, вы сохраните все элементы, используя int32/64. Как только вы вводите float, вам нужно использовать float32 / 64, чтобы сохранить все элементы массива, и вы всегда можете обратно преобразовать
floatвint. Как только вы вводите строку, вам нужно использовать строки для юридического представления все в массиве, и опять же, вы всегда можете обратно преобразовать вfloatилиint, Если вам нужноПример:
>>> array([1]).dtype dtype('int64') >>> array([1, 2.0]).dtype dtype('float64') >>> array([1, 2.0, 'a']).dtype dtype('S3')Короче говоря, это довольно умно;)
Comments