Адрес статьи серии
- Самый подробный учебник по NumPy (1): Массивы NumPy
- NumPy Super Detailed Tutorial (2): Типы данных
- NumPy Super Detailed Tutorial (3): внутренний механизм и расширенная итерация ndarray
Типы данных 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 фермеров старого кода