Как Numpy выводит dtype для массива



Может ли кто-нибудь помочь мне понять, откуда функция массива Numpy выводит тип данных.



Я понимаю, что он в основном выводит из вида значения, которое было присвоено массиву.



Например:



> data = [1,2,3,4]
> arr = np.array(data)


Таким образом, в приведенных выше строках "arr" будет иметь dtype('int64') или dtype('int32').

Я пытаюсь понять, как он решает, давать ли ему int64 или int32?

Я понимаю, что это может быть тривиальный вопрос, но я просто ... пытаясь понять, как это работает, как меня недавно спросили об этом в интервью.
776   4  

4 ответов:

Per The docs,

Некоторые типы, такие как int и intp, имеют различные разряды, зависящие от платформ (например, 32-битные и 64-битные машины).

Таким образом, на 32-битных машинах np.array([1,2,3,4]) возвращает массив dtype int32, но на 64-битных машинах он возвращает массив dtype int64.

К числовым типам данных относятся целые числа и числа с плавающей точкой.

Если у нас есть массив, содержащий как 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

    Ничего не найдено.