感谢阿里云天池龙珠训练营提供的学习计划,学习地址为:https://tianchi.aliyun.com/course/323
常量
numpy.nan
nan = NaN = NAN都表示空值
nan是不相等的
numpy.isnan用法:
numpy.isnan(x, /, out=None, *, where=True, casting=‘same_kind’, order=‘K’, dtype=None, subok=True[, signature, extobj]) = <ufunc ‘isnan’>
- 参数:
x: : array_like
输入数组。
out: : ndarray, None, 或 tuple of ndarray and None, 可选参数。结果存储的位置。如果提供,它必须具有输入广播到的形状。如果未提供或没有,则返回一个新分配的数组。元组(只能作为关键字参数)的长度必须等于输出的数量。
where: : array_like, 可选参数
此条件通过输入广播。在条件为True的位置,将out数组设置为ufunc结果。在其他地方,out数组将保留其原始值。请注意,如果通过默认创建未初始化的输出数组out=None,条件中为False的位置将保持未初始化状态。 - 返回值:
y: : ndarray或布尔
真实的地方x是NaN,否则为false。如果x是标量,则这是标量。 - 注意:
NumPy使用IEEE算术二进制浮点标准(IEEE 754)。这意味着非数字不等于无穷大。
【例如】
numpy.inf
- 表示正无穷大。
Inf = inf = infty = Infinity = PINF
numpy.pi
- 表示圆周率
numpy.e
- 表示自然常数
数据类型
常见的数据类型:
Python 原生的数据类型相对较少, bool、int、float、str等。这在不需要关心数据在计算机中表示的所有方式的应用中是方便的。然而,对于科学计算,通常需要更多的控制。为了加以区分 numpy 在这些类型名称末尾都加了“_”。
下表列举了常用 numpy 基本类型。
类型 | 备注 | 说明 |
---|---|---|
bool_ = bool8 | 8位 | 布尔类型 |
int8 = byte | 8位 | 整型 |
int16 = short | 16位 | 整型 |
int32 = intc | 32位 | 整型 |
int_ = int64 = long = int0 = intp | 64位 | 整型 |
uint8 = ubyte | 8位 | 无符号整型 |
uint16 = ushort | 16位 | 无符号整型 |
uint32 = uintc | 32位 | 无符号整型 |
uint64 = uintp = uint0 = uint | 64位 | 无符号整型 |
float16 = half | 16位 | 浮点型 |
float32 = single | 32位 | 浮点型 |
float_ = float64 = double | 64位 | 浮点型 |
str_ = unicode_ = str0 = unicode | Unicode 字符串 | |
datetime64 | 日期时间类型 | |
timedelta64 | 表示两个时间之间的间隔 |
创建数据类型
NumPy 数字类型是dtype(数据类型)对象的实例,每个对象具有唯一的特征。 这些类型可以是np.bool_,np.float32等
每个内建类型都有一个唯一定义它的字符代码,如下:
字符 | 对应类型 | 备注 |
---|---|---|
b | boolean | ‘b1’ |
i | signed integer | ‘i1’, ‘i2’, ‘i4’, ‘i8’ |
u | unsigned integer | ‘u1’, ‘u2’ ,‘u4’ ,‘u8’ |
f | floating-point | ‘f2’, ‘f4’, ‘f8’ |
c | complex floating-point | 复数浮点 |
m | timedelta64 | 表示两个时间之间的间隔 |
M | datetime64 | 日期时间类型 |
O | object | Python 对象 |
S | (byte-)string | S3表示长度为3的字符串 |
U | Unicode | Unicode 字符串 |
V | void | 原始数据(void) |
dtype可由以下语法构造
numpy.dtype(object, align, copy)
数据类型信息
Python 的浮点数通常是64位浮点数,几乎等同于 np.float64。
NumPy和Python整数类型的行为在整数溢出方面存在显着差异,与 NumPy 不同,Python 的int 是灵活的。这意味着Python整数可以扩展以容纳任何整数并且不会溢出。
时间日期和时间增量
- datetime64
在 numpy 中,我们很方便的将字符串转换成时间日期类型 datetime64(datetime 已被 python 包含的日期时间库所占用)。
datatime64是带单位的日期时间类型,其单位如下:
日期单位 | 代码含义 | 时间单位 | 代码含义 |
---|---|---|---|
Y | 年 | h | 小时 |
M | 月 | m | 分钟 |
W | 周 | s | 秒 |
D | 天 | ms | 毫秒 |
- | - | us | 微秒 |
- | - | ns | 纳秒 |
- | - | ps | 皮秒 |
- | - | fs | 飞秒 |
- | - | as | 阿托秒 |
相邻单位之间互为1000的倍数
单个时间格式字符串转换为numpy的datetime对象,可使用datetime64实例化一个对象
从字符串创建 datetime64 类型时,默认情况下,numpy 会根据字符串自动选择对应的单位
同时也可以自己指定类型。
反过来numpy的datetime对象转换为时间格式字符串,可使用datetime_as_string()函数,如下所示:
- 从字符串创建 datetime64 数组时,如果单位不统一,则一律转化成其中最小的单位。
- 使用arange()创建 datetime64 数组,用于生成日期范围
datetime,Timestamp和datetime64之间转换
from IPython.display import Image
from IPython.core.display import HTML
Image(url= "https://i.stack.imgur.com/uiXQd.png")
datetime64 和 timedelta64 运算
timedelta64 表示两个 datetime64 之间的差。timedelta64 也是带单位的,并且和相减运算中的两个 datetime64 中的较小的单位保持一致
日期对调位置之后结果并不相同,有正负之分。
生成 timedelta64时,要注意年(‘Y’)和月(‘M’)这两个单位无法和其它单位进行运算
import numpy as np
a = np.timedelta64(1, 'Y')
b = np.timedelta64(a, 'M')
print(a) # 1 years
print(b) # 12 months
c = np.timedelta64(1, 'h')
d = np.timedelta64(c, 'm')
print(c) # 1 hours
print(d) # 60 minutes
print(np.timedelta64(a, 'D'))
# TypeError: Cannot cast NumPy timedelta64 scalar from metadata [Y] to [D] according to the rule 'same_kind'
print(np.timedelta64(b, 'D'))
# TypeError: Cannot cast NumPy timedelta64 scalar from metadata [M] to [D] according to the rule 'same_kind'
datetime64 的应用
为了允许在只有一周中某些日子有效的上下文中使用日期时间,NumPy包含一组“busday”(工作日)功能。
busday函数的默认值是,唯一有效的天数是周一到周五(通常的工作日)。该实现基于包含7个布尔标志以指示有效天的“周掩模”;可以指定其他组的有效天数的自定义周边掩码。
“busday”功能还可以检查“假日”日期的列表,不是有效日期的特定日期。
numpy.busday_offset(dates, offsets, roll='raise', weekmask='1111100', holidays=None, busdaycal=None, out=None)
参数roll:{‘raise’, ‘nat’, ‘forward’, ‘following’, ‘backward’, ‘preceding’, ‘modifiedfollowing’, ‘modifiedpreceding’}
- ‘raise’ means to raise an exception for an invalid day.
- ‘nat’ means to return a NaT (not-a-time) for an invalid day.
- ‘forward’ and ‘following’ mean to take the first valid day later in time.
- ‘backward’ and ‘preceding’ mean to take the first valid day earlier in time.
将指定的偏移量应用于工作日,单位天(‘D’)。计算下一个工作日,如果当前日期为非工作日,默认报错。可以指定 forward 或 backward 规则来避免报错。(一个是向前取第一个有效的工作日,一个是向后取第一个有效的工作日)
import numpy as np
# 2021-05-18 星期二
a = np.busday_offset('2021-05-18', offsets=1)
print(a) # 2021-05-19
a = np.busday_offset('2021-05-16', offsets=1)
print(a)
# ValueError: Non-business day date in busday_offset
a = np.busday_offset('2021-05-16', offsets=0, roll='forward')
b = np.busday_offset('2021-05-16', offsets=0, roll='backward')
print(a) # 2021-05-17
print(b) # 2021-05-14
a = np.busday_offset('2020-05-16', offsets=1, roll='forward')
b = np.busday_offset('2020-05-16', offsets=1, roll='backward')
print(a) # 2021-05-18
print(b) # 2021-05-17
可以指定偏移量为 0 来获取当前日期向前或向后最近的工作日,当然,如果当前日期本身就是工作日,则直接返回当前日期。
【例如】返回指定日期是否是工作日
import numpy as np
# 2021-05-18 星期二
# 2021-05-16 星期日
a = np.is_busday('2021-05-18')
b = np.is_busday('2021-05-16')
print(a) # True
print(b) # False
【例如】统计一个 datetime64[D] 数组中的工作日天数
import numpy as np
# 2021-05-18 星期二
```python
begindates = np.datetime64('2021-05-18')
enddates = np.datetime64('2021-05-28')
a = np.arange(begindates, enddates, dtype='datetime64')
b = np.count_nonzero(np.is_busday(a))
print(a)
# ['2021-05-18' '2021-05-19' '2021-05-20' '2021-05-21' '2021-05-22'
# '2021-05-23' '2021-05-24' '2021-05-25' '2021-05-26' '2021-05-27']
print(b) # 8
数组的创建
numpy 提供的最重要的数据结构是ndarray,它是 python 中list的扩展
1. 依据现有数据来创建 ndarray
(a)通过array()函数进行创建。
创建一维数组
创建二维数组
创建三维数组
(b)通过asarray()函数进行创建
array()和asarray()都可以将结构数据转化为 ndarray,但是array()和asarray()主要区别就是当数据源是ndarray 时,array()仍然会 copy 出一个副本,占用新的内存,但不改变 dtype 时 asarray()不会。
def asarray(a, dtype=None, order=None):
return array(a, dtype, copy=False, order=order)
array()和asarray()的区别。(array()和asarray()主要区别就是当数据源是ndarray 时,array()仍然会 copy 出一个副本,占用新的内存,但不改变 dtype 时 asarray()不会。
(c)通过fromfunction()函数进行创建
给函数绘图的时候可能会用到fromfunction(),该函数可从函数中创建数组
def fromfunction(function, shape, **kwargs):
以下使用fromfunction函数,创建一个数组a,a返回的结果是经过我们自定义的函数的结果,所以a中存储的是y的值,而i其实就是数组的索引;也就是说,数组a存储的是i取值从0到1时,y的值。fromfunction的第二个参数定义了输出数组的形状,也表示i的取值范围。
如果要创建的是二维数组,则函数式需要两个自变量,比如y=i*j:
2. 依据 ones 和 zeros 填充方式
在机器学习任务中经常做的一件事就是初始化参数,需要用常数值或者随机值来创建一个固定大小的矩阵。
(a)零数组
- zeros()函数:返回给定形状和类型的零数组。
- zeros_like()函数:返回与给定数组形状和类型相同的零数组。
def zeros(shape, dtype=None, order='C'):
def zeros_like(a, dtype=None, order='K', subok=True, shape=None):
(b)1数组
- ones()函数:返回给定形状和类型的1数组。
- ones_like()函数:返回与给定数组形状和类型相同的1数组。
def ones(shape, dtype=None, order='C'):
def ones_like(a, dtype=None, order='K', subok=True, shape=None):
(c)空数组
- empty()函数:返回一个空数组,数组元素为随机数。
- empty_like函数:返回与给定数组具有相同形状和类型的新数组。
def empty(shape, dtype=None, order='C'):
def empty_like(prototype, dtype=None, order='K', subok=True, shape=None):
(d)单位数组
- eye()函数:返回一个对角线上为1,其它地方为零的单位数组。
- identity()函数:返回一个方的单位数组。
def eye(N, M=None, k=0, dtype=float, order='C'):
def identity(n, dtype=None):
(e)对角数组
- diag()函数:提取对角线或构造对角数组。
def diag(v, k=0):
(f)常数数组
- full()函数:返回一个常数数组。
- full_like()函数:返回与给定数组具有相同形状和类型的常数数组。
def full(shape, fill_value, dtype=None, order='C'):
def full_like(a, fill_value, dtype=None, order='K', subok=True, shape=None):
3. 利用数值范围来创建ndarray
- arange()函数:返回给定间隔内的均匀间隔的值。
- linspace()函数:返回指定间隔内的等间隔数字。
- logspace()函数:返回数以对数刻度均匀分布。
- numpy.random.rand() 返回一个由[0,1)内的随机数组成的数组。
def arange([start,] stop[, step,], dtype=None):
def linspace(start, stop, num=50, endpoint=True, retstep=False,
dtype=None, axis=0):
def logspace(start, stop, num=50, endpoint=True, base=10.0,
dtype=None, axis=0):
def rand(d0, d1, ..., dn):
4. 结构数组的创建
结构数组,首先需要定义结构,然后利用np.array()来创建数组,其参数dtype为定义的结构。
(a)利用字典来定义结构
import numpy as np
personType = np.dtype({
'names': ['name', 'age', 'weight'],
'formats': ['U30', 'i8', 'f8']})
a = np.array([('Liming', 24, 63.9), ('XiaoHong', 15, 67.), ('Cat', 34, 45.8)],
dtype=personType)
print(a, type(a))
(b)利用包含多个元组的列表来定义结构