NumPy Super Detailed Tutorial (2): Типы данных

NumPy

Адрес статьи серии


Типы данных NumPy

1. Типы данных в NumPy

NumPyКоэффициент поддержкиPythonБольше видов числовых типов, типы данных, перечисленные в следующей таблице,NumPyвстроенные типы данных, чтобы отличить их отPythonродные типы данных,bool,int,float,complex,strи т. д. добавляются в конце имени типа_.

print(numpy.dtype)Все показанныеNumPyтип данных вPythonСобственные типы данных.

имя типа описывать
bool_ логический тип
unicode_/unicode/str_/str0 (ноль не буква O) Строка Юникода
int8 / byte
int16 / short
int32 / intc / int_ / long
Int64 / onglong / intp / int0 (нулевой не буквенный o)
uint8 / ubyte
uint16 / ushort
uint32 / uintc
uint64/ulonglong/uintp/uint0 (ноль, не являющийся буквой O)
float16 / half Число с плавающей запятой половинной точности, включая: 1 бит знака, 5 бит экспоненты, 10 бит мантиссы
float32 / single Число одинарной точности с плавающей запятой, включая: 1 бит знака, 8 бит экспоненты, 23 бита мантиссы
float64 / float_ / double Число двойной точности с плавающей запятой, включая: 1 бит знака, 11 бит экспоненты, 52 бита мантиссы
complex64 / singlecomplex Комплексное число, представляющее двойное 32-битное число с плавающей запятой (действительная и мнимая части)
complex128 / complex_ / cfloat / cdouble /
longcomplex / clongfloat / clongdouble
Комплексное число, представляющее двойное 64-битное число с плавающей запятой (действительная и мнимая части)
datetime64 Типы даты и времени, поддерживаемые начиная с NumPy 1.7
timedelta64 представляет собой интервал между двумя временами

Я немного не понимаю здесь.У меня 64-битная система win7.Вышеуказанные типы - это все, что я измерил.Однако, когда я смотрю на исходный код, он определяется следующим образом. Короче говоря, в целях безопасности рекомендуется использовать однозначные типы, такие как int32 и int64.

int_ = long
intp = long
int64 = long
int0 = long

class long(signedinteger):
    """ 64-bit integer. Character code 'l'. Python int compatible. """
    pass

Приложение: Понятие множественного числа

Мы называем числа вида z=a+bi (a, b — действительные числа) комплексными числами, где a называется действительной частью, b — мнимой частью, а i — мнимой единицей. Когда мнимая часть b=0, комплексное число z действительно; Когда мнимая часть b!=0, комплексное число z является мнимым; Комплексное число z является чисто мнимым числом, когда мнимая часть b!=0 и действительная часть a=0.

2. Использование даты и времени64

Ⅰ Простой пример

Пример 1:

import numpy as np

a = np.datetime64('2019-03-01')
print(a)

выход:

2019-03-01

Пример 2:

import numpy as np

a = np.datetime64('2019-03')
print(a)

выход:

2019-03

Если вы его не видите, вы можете отображать только «месяц», не так ли?

Ⅱ. Использование устройства

datetime64Можно указать используемые единицы, включая годы ('Y'), месяцы ('M'), недели ('W') и дни ('D'), а единицами времени являются часы ('h'), минуты ( 'm')), секунды ('s'), миллисекунды ('ms'), микросекунды ('us'), наносекунды ('ns'), пикосекунды ('ps'), фемтосекунды ('fs'), аттосекунды ('так как').

Пример третий:Неделя ('W') - нечетная единица, показывающая текущую, если это четверг, и предыдущий четверг, если это не так. Тогда я подумал,Предположительно потому, что 01.01.1970 — четверг..

import numpy as np

a = np.datetime64('2019-03-07', 'W')
b = np.datetime64('2019-03-08', 'W')
print(a, b)

выход:(2019-03-07 — четверг)

2019-03-07 2019-03-07

Пример 4:создать из строкиdatetime64Когда тип по умолчаниюNumPyСоответствующая единица измерения выбирается автоматически на основе строки.

import numpy as np

a = np.datetime64('2019-03-08 20:00')
print(a.dtype)

выход:

datetime64[m]

Пример 5:Также можно принудительно использовать устройство.

import numpy as np

a = np.datetime64('2019-03', 'D')
print(a)

выход:

2019-03-01

Пример 6:Как видно из приведенного выше примера,2019-03а также2019-03-01На самом деле это одно и то же время. В самом деле, если дваdatetime64Объекты имеют разные единицы измерения и могут по-прежнему представлять один и тот же момент. И безопасно конвертировать из более крупных единиц (например, месяцев) в более мелкие единицы (например, дни).

import numpy as np

print(np.datetime64('2019-03') == np.datetime64('2019-03-01'))

выход:

True

Пример седьмой:При создании массива даты и времени из строки, если единица измерения неоднородна, она будет преобразована в наименьшую единицу.

import numpy as np

a = np.array(['2019-03', '2019-03-08', '2019-03-08 20:00'], dtype='datetime64')
print(a)
print(a.dtype)

выход:

['2019-03-01T00:00' '2019-03-08T00:00' '2019-03-08T20:00']
datetime64[m]

Ⅲ Используйте с функцией аранжировки

**Пример 8:**Все дни месяца

import numpy as np

a = np.arange('2019-02', '2019-03', dtype='datetime64[D]')
print(a)

выход:

['2019-02-01' '2019-02-02' '2019-02-03' '2019-02-04' '2019-02-05'
 '2019-02-06' '2019-02-07' '2019-02-08' '2019-02-09' '2019-02-10'
 '2019-02-11' '2019-02-12' '2019-02-13' '2019-02-14' '2019-02-15'
 '2019-02-16' '2019-02-17' '2019-02-18' '2019-02-19' '2019-02-20'
 '2019-02-21' '2019-02-22' '2019-02-23' '2019-02-24' '2019-02-25'
 '2019-02-26' '2019-02-27' '2019-02-28']

Пример девятый:Интервал также может быть в виде 3 дней («3D»).

import numpy as np

a = np.arange('2019-02', '2019-03', dtype='datetime64[3D]')
print(a)

выход:

['2019-02-01' '2019-02-04' '2019-02-07' '2019-02-10' '2019-02-13'
 '2019-02-16' '2019-02-19' '2019-02-22' '2019-02-25']

Найдено нет, есть меньше 2019-02-28. Думаю, это баг, и удалять его не имеет смысла.

IV, Datetime64 и Timedelta64 операции

Пример 1: timedelta64означает дваDatetime64разница между.timedelta64также является унитарным и суммирует два в операции вычитанияDatetime64Меньшие единицы в последовательны.

import numpy as np

a = np.datetime64('2019-03-08') - np.datetime64('2019-03-07')
b = np.datetime64('2019-03-08') - np.datetime64('2019-03-07 08:00')
c = np.datetime64('2019-03-08') - np.datetime64('2019-03-07 23:00', 'D')

print(a, a.dtype)
print(b, b.dtype)
print(c, c.dtype)

выход:

1 days timedelta64[D]
960 minutes timedelta64[m]
1 days timedelta64[D]

Глядя на выражение для с, так как единицы принудительно, поэтомуnp.datetime64('2019-03-07 23:00', 'D')Указанное время действительно2019-03-07, то результат равен 1, что легко понять.

Пример 2:

import numpy as np

a = np.datetime64('2019-03') + np.timedelta64(20, 'D')
print(a)

выход:

2019-03-21

V, Timedelta64 отдельная операция

**Пример 1:**СоздатьTimedelta64

import numpy as np

a = np.timedelta64(1, 'Y')    # 方式一
b = np.timedelta64(a, 'M')    # 方式二
print(a)
print(b)

выход:

1 years
12 months

**Пример 2: **Сложение, вычитание, умножение и деление

import numpy as np

a = np.timedelta64(1, 'Y')
b = np.timedelta64(6, 'M')

print(a + b)
print(a - b)
print(2 * a)
print(a / b)

выход:

18 months
6 months
2 years
2.0

Пример третий:Однако две единицы года («Г») и месяца («М») обрабатываются особым образом, их нельзя рассчитать с другими единицами, сколько дней в году? Сколько часов в месяце? Это неопределенно.

import numpy as np

a = np.timedelta64(1, 'M')
b = np.timedelta64(a, 'D')

выход:

TypeError: Cannot cast NumPy timedelta64 scalar from metadata [M] to [D] according to the rule 'same_kind'

Ⅵ, преобразование numpy.datetime64 и datetime.datetime

import numpy as np
import datetime

dt = datetime.datetime(2018, 9, 1)
dt64 = np.datetime64(dt, 'D')
print(dt64, dt64.dtype)

dt2 = dt64.astype(datetime.datetime)
print(dt2)

выход:

2018-09-01 datetime64[D]
2018-09-01

VII. Функция рабочего дня (Busday)

busdayПо умолчанию с понедельника по пятницу рабочие дни. Реализация основана наweekmask, содержащий 7 логических флагов для дней недели.

**Пример 1:**busday_offset busday_offset применяет указанное смещение к дням недели в днях («D»). Например, чтобы рассчитать следующий рабочий день:

import numpy as np

a = np.busday_offset('2019-03-08', 1)
print(a)

выход:

2019-03-11

Пример 2:Если текущая дата не является рабочим днем, по умолчанию будет сообщено об ошибке.

import numpy as np

a = np.busday_offset('2019-03-09', 1)
print(a)

выход:

ValueError: Non-business day date in busday_offset

Пример третий:можно указатьforwardилиbackwardправила во избежание ошибок.

import numpy as np

a = np.busday_offset('2019-03-09', 1, roll='forward')
b = np.busday_offset('2019-03-09', 1, roll='backward')
print(a)
print(b)

c = np.busday_offset('2019-03-09', 0, roll='forward')
d = np.busday_offset('2019-03-09', 0, roll='backward')
print(c)
print(d)

выход:

2019-03-12
2019-03-11
2019-03-11
2019-03-08

Вы можете указать смещение 0, чтобы получить ближайший рабочий день вперед или назад от текущей даты.Конечно, если текущая дата сама по себе является рабочим днем, текущая дата будет возвращена напрямую.

Пример 4:

import numpy as np

a = np.busday_offset('2019-05', 1, roll='forward', weekmask='Sun')
print(a)

выход:

2019-05-12

День матери — второе воскресенье мая, поэтому этот пример можно использовать для возврата конкретной даты Дня матери. Объяснить:weekmaskПараметр может передавать сюда английское сокращение недели (обратите внимание, что сокращения - Mon, Tue, Wed, Thu, Fri, Sat, Sun, все написаны с ошибками), указывать день недели вперед или назад. Значение приведенного выше кода: второе (не забывайте, индекс начинается с 0) воскресенье после 01.05.2019.

Эта функция может быть полезна для Laomei, но в Китае, кто спросит меня, в каком месяце Фестиваль лодок-драконов?

**Пример 5: **is_busday Возвращает значение, является ли указанная дата рабочим днем.

import numpy as np

a = np.is_busday(np.datetime64('2019-03-08'))
b = np.is_busday('2019-03-09')
print(a)
print(b)

выход:

True
False

**Пример 6: **busday_count Возвращает количество рабочих дней между двумя датами.

import numpy as np

a = np.busday_count(np.datetime64('2019-03-01'), np.datetime64('2019-03-10'))
b = np.busday_count('2019-03-10', '2019-03-01')
print(a)
print(b)

выход:

6
-6

**Пример 7:**count_nonzero Подсчитайте количество рабочих дней в массиве datetime64['D'].

import numpy as np

c = np.arange('2019-03-01', '2019-03-10', dtype='datetime64')
d = np.count_nonzero(np.is_busday(c))
print(d)

выход:

6

Пример 8:Пользовательское значение маски недели, указывающее, какие недели недели являются рабочими днями.

import numpy as np

a = np.is_busday('2019-03-08', weekmask=[1, 1, 1, 1, 0, 1, 0])
b = np.is_busday('2019-03-09', weekmask='1111010')
print(a)
print(b)

выход:

False
True

Значение маски недели также может отображать все рабочие дни непосредственно с сокращением слова недели. .

weekmask='Mon Tue Wed Thu Sat Sun'

3. Объект типа данных: dtype

Объект типа данных используется для описания того, как используется область памяти, соответствующая массиву, что зависит от следующих аспектов:

  • тип данных (целое число, число с плавающей запятой илиPythonобъект)
  • Размер данных (например, сколько байтов используется для хранения целых чисел)
  • Порядок байтов данных (с прямым порядком байтов "", старший байт с прямым порядком байтов находится перед младшим байтом, младший байт с прямым порядком байтов находится впереди, а старший байт позади)
  • В случае структурированных типов имя поля, тип данных каждого поля и часть блока памяти, которую занимает каждое поле (см. пример 3).
  • Если тип данных является подмассивом, его форма и порядок байтов типа данных определяются добавлением «» к типу данных.

Ⅰ Создайте экземпляр объекта dtype

Синтаксис построения объекта dtype:

numpy.dtype(obj, align=False, copy=False)
параметр описывать
object объект для преобразования в объект типа данных
align Если True, заполняет поля, чтобы сделать его C-подобной структурой, может быть True, только если объект является словарем или строкой, разделенной запятыми.
copy скопируйте объект dtype или, если False, ссылку на встроенный объект dtype

Пример 1: int8, int16, int32, int64Четыре типа данных могут быть заменены строками «i1», «i2», «i4», «i8». (см. коды символов)

import numpy as np

dt = np.dtype('i4')
print(dt)

выход:

int32

Пример 2:

import numpy as np

dt = np.dtype('<i4')
print(dt)

выход:

int32

Пример третий:В этом примере определяется структурированный тип данныхstudent, Содержат строковые поляname, целочисленное полеage, и поместите этоdtypeприменимый кndarrayобъект.

import numpy as np
student = np.dtype([('name', 'S20'), ('age', 'i1')])
print(student)

a = np.array([('tom', 21), ('Jerry', 18)], dtype=student)
print(a)

выход:

[('name', 'S20'), ('age', 'i1')]
[(b'tom', 21) (b'Jerry', 18)]

Ⅱ Код символа

код символа Соответствующий тип
b логический
i Целое число со знаком, 'i1', 'i2', 'i4', 'i8' соответствуют int8, int16, int32, int64
u Беззнаковое целое, 'u1', 'u2', 'u4', 'u8' соответствуют uint8, uint16, uint32, uint64
f Тип float, 'f2', 'f4', 'f8' соответствуют float16, float32, float64
c Комплексные числа, «с8», «с16» соответствуют комплексу 64, комплексу 128.
m timedelta64 (интервал времени), по сути, int64
М (верхний регистр) дата-время64 (дата-время)
О (верхний регистр) Объект Python
S (верхний регистр) / а (байтовая) строка, которая может содержать только символы кода ASCII, S или a, за которыми следует число, указывающее длину строки, лишняя часть будет усечена, например, S20, a10
У (верхний регистр) Строка Unicode с номером после U для обозначения длины строки, лишняя часть будет усечена, например U20
В (заглавная) массив байтов, число после V указывает на длину массива, лишняя часть будет обрезана, а нехватка заполнена нулями

Здесь мы в основном говорим об использовании M и V, другие относительно просты и понятны, вы можете увидеть пример выше.

Пример использования кода символа M:

import numpy as np

student = np.dtype([('name', 'S4'), ('age', 'M8[D]')])
print(student)

a = np.array([('tom', '2011-01-01'), ('Jerry', np.datetime64('2012-05-17'))], dtype=student)
print(a)
print(a['age'].dtype)

выход:

[('name', 'S4'), ('age', '<M8[D]')]
[(b'tom', '2011-01-01') (b'Jerr', '2012-05-17')]
datetime64[D]

Здесь вы должны написать в M8 [Unit], не добавляйте единицу в отчет:Cannot cast NumPy timedelta64 scalar from metadata [D] to according to the rule 'same_kind'.

Пример использования кода символа V:

import numpy as np

student = np.dtype([('name', 'V8'), ('age', 'i1')])
print(student)

a = np.array([(b'tom', 21), (b'Jerry', 18)], dtype=student)
print(a)
print(a['name'].dtype)

выход:

[('name', 'V8'), ('age', 'i1')]
[(b'\x74\x6F\x6D\x00\x00\x00\x00\x00', 21)
 (b'\x4A\x65\x72\x72\x79\x00\x00\x00', 18)]
|V8

4. numpy.datetime_data

грамматика:

numpy.datetime_data(dtype, /)

**параметры:** могут быть толькоdatetime64илиtimedelta64Типы **возвращаемое значение: **возвращать кортеж ("единица", шаг)

Пример 1:

import numpy as np

dt_25s = np.dtype('timedelta64[25s]')
print(np.datetime_data(dt_25s))

выход:

('s', 25)

Пример 2:

import numpy as np

dt_25s = np.dtype('timedelta64[25s]')
b = np.array([1, 2, 3, 4, 5], dt_25s).astype('timedelta64[s]')
print(b)
print(b.dtype)

выход:

[ 25  50  75 100 125]
timedelta64[s]

В этом примереbЯвляетсяnarray, тип данных изtimedelta64[25s]превратился вtimedelta64[s], поэтому каждое число в массиве умножается на 25.

5. numpy.datetime_as_string

Преобразование массива даты и времени в массив строк.

грамматика:

numpy.datetime_as_string(arr, unit=None, timezone='naive', casting='same_kind')
параметр описывать
arr массив datetimes64
unit 'auto' или datetime64 единицы.
timezone Часовой пояс
casting Преобразование разрешено при переходе между единицами даты и времени. Доступны следующие необязательные значения: 'нет', 'эквивалент', 'безопасно', 'такой же_вид', 'небезопасно'.

Пример 1:

import numpy as np

dt_array = np.arange('2019-03-01', '2019-03-10', dtype='datetime64[D]')
str_array = np.datetime_as_string(dt_array)

print(str_array)
print(str_array.dtype)

выход:

['2019-03-01' '2019-03-02' '2019-03-03' '2019-03-04' '2019-03-05'
 '2019-03-06' '2019-03-07' '2019-03-08' '2019-03-09']
<U28

**Пример 2: **пример использования единицы измерения по умолчанию,unit=None, если единицы элементов datetime64 в массиве несовместимы, они будут равномерно преобразованы в наименьшую единицу для вывода, еслиunit='auto'сохранит вывод как есть. Конечно, если единица измерения указана, вывод будет в указанном формате единицы измерения.

import numpy as np

dt_array = np.array(['2019-03', '2019-03-08', '2019-03-08 20:00'], dtype='datetime64')

str_array1 = np.datetime_as_string(dt_array)
str_array2 = np.datetime_as_string(dt_array, unit='auto')
str_array3 = np.datetime_as_string(dt_array, unit='D')
print(str_array1)
print(str_array2)
print(str_array3)

выход:

['2019-03-01T00:00' '2019-03-08T00:00' '2019-03-08T20:00']
['2019-03-01' '2019-03-08' '2019-03-08T20:00']
['2019-03-01' '2019-03-08' '2019-03-08']

Добро пожаловать, чтобы обратить внимание на мой общедоступный номер

Python Road фермеров старого кода

扫码关注我的个人公众号