numpy
Array¶
属性¶
a.dtype数组的数据类型a.flags返回内存布局的信息a.itemsize每个元素的字节长度a.ndim数组的维度数a.size数组的元素数a.shape各维度的长度组成的元组a.strides各维度前进一步所需跨越的字节数组成的元组
a.data返回指向数据块的 buffer 对象a.flat返回数组的 flatitier 对象a.base若使用的内存来自别的对象,则返回原对象,否则返回 None
a.__array_interface__返回 (数据块地址, 是否只读)
生成数组¶
np.array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0, like=None)dtype数据类型'u1'等效于'uint8'和np.uint8'i''i4'等效于'int32'和np.int32'f''f4'等效于'float32'和np.float32
copy若为 True 则深拷贝 object,否则视情况而决定是否拷贝order内存布局,若 object 非数组则默认为 C 顺序subok若为 True 则 array 的子类的类别会被保留,否则会强制转换ndmin最小的维度数,1 会被用来填充空白
np.empty(shape, dtype=float, order='C', *, like=None)返回未初始化的数组np.zeros(shape, dtype=float, order='C', *, like=None)返回初始化为 0 的数组np.ones(shape, dtype=float, order='C', *, like=None)返回初始化为 1 的数组np.full(shape, fill_value, dtype=None, order='C', *, like=None)返回初始化为指定值的数组dtype默认为np.array(fill_value).dtype
np.arange([start,] stop[, step,], dtype=None, *, like=None)start,stop和step支持使用浮点数dtype若为 None 则从其他参数中推断
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)num生成的样本数,默认为 50endpoint若为 True 则会包含stopretstep若为 True 则返回的是 (样本, 步长)dtype若为 None 则从其他参数中推断,但绝不会是整数
np.meshgrid(*xi, copy=True, sparse=False, indexing='xy')生成网格点坐标矩阵,返回的坐标矩阵数等于输入的坐标向量数copy若为 False,则只会返回原有数组的视图indexing坐标矩阵的索引方式,假设坐标向量的长度依次为 M, N, P'xy'网格点先沿横轴展开,坐标矩阵的形状为 (M, N) 或 (M, N, P)'ij'网格点先沿纵轴展开,坐标矩阵的形状为 (N, M) 或 (N, M, P)
转换类型¶
np.asarray(a, dtype=None, order=None, *, like=None)将输入数据转换为数组- 已存在的数组不会被拷贝
- 若设置了
dtype,则只有当数据类型不匹配时会拷贝
np.asfarray(a, dtype=<class 'numpy.float64'>)强制转换为数据类型为 float64 的数组- 只有当数据类型不匹配时会拷贝
a.astype(dtype, order='K', casting='unsafe', subok=True, copy=True)返回数组的副本,已被转换为指定数据类型
合并拆分¶
np.concatenate((a1, a2, ...), axis=0, out=None, dtype=None, casting="same_kind")沿指定维度连接多个数组,返回副本a1, a2, ...除了axis指定的维度,其他维度必须相同axis用于连接的维度的索引,若为 None 则会先展平数组out结果输出的数组,形状需与输出相同,此时返回的也是该数组
np.stack(arrays, axis=0, out=None, *, dtype=None, casting='same_kind')沿新的维度连接多个数组,返回副本arrays所有数组应有相同的形状axis新的维度的索引
np.vstack(tup, *, dtype=None, casting='same_kind')沿第一个维度连接多个数组,返回副本,一维数组的形状会转换为 (1, N)tup除了第一个维度,其他维度必须相同,若为一维数组则必须长度相同
np.hstack(tup, *, dtype=None, casting='same_kind')沿第二个维度连接多个数组,返回副本,一维数组会直接拼接tup除了第二个维度,其他维度必须相同
np.split(ary, indices_or_sections, axis=0)沿指定维度切割数组,返回视图indices_or_sections整数或一维数组- 若为整数 N,则会平分为 N 份,无法平分则报错
- 若为一维数组,例如 (M, N, P),则会取索引 [0: M], [M: N], [N: P], [P, len(ary.shape[axis])],若不存在则会返回空数组
np.vsplit(ary, indices_or_sections)沿第一个维度切割数组,返回视图np.hsplit(ary, indices_or_sections)沿第二个维度切割数组,返回视图,一维数组会沿第一个维度切割
改变形状¶
np.reshape(a, newshape, order='C')改变数组形状,返回视图,仅在必要时返回副本newshape若为整数,则会转换为一维数组;若为数组,其中一个维度可以使用 -1,其具体值由其他值推断出
a.reshape(shape, order='C')改变数组形状,返回视图,仅在必要时返回副本shape若为数组,其元素可直接分开传入
a.flatten(order='C')展平数组,返回副本a/np.ravel(a, order='C')展平数组,返回视图,仅在必要时返回副本
a/np.squeeze(axis=None)除去数组中长度为一的维度axisNone 或整数或整数元组,若指定的维度长度不为一则报错
np.expand_dims(a, axis)扩展维度,返回视图axis整数或整数元组,指定的索引会插入新的维度
- 此外,还可以使用 np.newaxis (None) 来扩展维度:
>>> a = np.arange(6).reshape(2, 3) >>> a[np.newaxis, :, np.newaxis].shape (1, 2, 1, 3) >>> a[np.newaxis, :, :, np.newaxis].shape (1, 2, 3, 1)
转置翻转¶
np.transpose(a, axes=None)转置数组,返回视图axes必须为 [0,1,...,N-1] 的一个排列,默认为 a.shape[::-1]
np.flip(m, axis=None)沿指定轴翻转数组,返回视图axis若为 None,则沿所有轴翻转;若为整数或整数元组,则沿指定轴翻转
数值计算¶
a/np.all(axis=None, out=None, keepdims=False, *, where=True)若所有元素的计算结果均为 True,则返回 Truea/np.any(axis=None, out=None, keepdims=False, *, where=True)若任意元素的计算结果为 True,则返回 TrueaxisNone 或整数或整数元组- 若为 None,则会沿所有维度移动做逻辑运算,返回一个布尔值
- 若指定维度,则会保持其他维度不变,沿指定维度移动做逻辑运算,运算结果保存在其他维度指定的位置,返回一个维度数减少的数组
keepdims若为 True,则被消去的维度会保留,其长度变为一where布尔数组,只有为 True 的元素参与逻辑运算
a/np.max(axis=None, out=None, keepdims=False, initial=<no value>, where=True)返回沿指定轴的最大值a/np.min(axis=None, out=None, keepdims=False, initial=<no value>, where=True)返回沿指定轴的最小值axisNone 或整数或整数元组initial输出值的最小/大值
a/np.sum(axis=None, dtype=None, out=None, keepdims=False, initial=0, where=True)返回沿指定轴的累加值a/np.prod(axis=None, dtype=None, out=None, keepdims=False, initial=1, where=True)返回沿指定轴的累乘值dtype默认使用原数组的数据类型,除非原数组的数据类型是整数类型,且精度不足平台默认整型精度,此时会使用平台默认整型initial计算累加/乘值的起始值
a/np.mean(axis=None, dtype=None, out=None, keepdims=False, *, where=True)返回沿指定轴的平均值dtype默认情况下,整数数组的输出类型为 float64,浮点数数组的输出类型保持不变
a/np.cumsum(axis=None, dtype=None, out=None)返回沿指定轴的累积和a/np.cumprod(axis=None, dtype=None, out=None)返回沿指定轴的累积乘积axisNone 或整数- 若为 None,则会先展平数组,返回一个一维数组
- 若指定维度,则会保持其他维度不变,沿指定维度移动做累加/累积,运算结果保存在原来位置,返回一个形状不变的数组
a/np.dot(b, out=None)返回 a 与 b 的点积,与@相似- 若 a 与 b 均为一维数组,则作内积
- 若 a 与 b 均为二维数组,则作矩阵乘法
- 若 a 或 b 为标量,则作简单相乘
- 若 a 为 N 维数组,b 为一维数组,则沿最后一个维度作点积,返回的数组的维度数减一
- 若 a 为 N 维数组,b 为 M(M>=2) 维数组,则沿 a 的最后一个维度和 b 的倒数第二个维度作点积,返回的数组的维度数减二,如
dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])
其他方法¶
np.copy(a, order='K', subok=False)拷贝数组np.copyto(dst, src, casting='same_kind', where=True)拷贝 src 到 dst,可用于选择性复制a.copy(order='C')返回数组的副本,更为推荐使用a.view([dtype][, type])返回数组的视图
a.tobytes(order='C')将数组转换为字节序列,返回副本a.tolist()将数组转换为列表,返回副本,若数组零维则返回一个标量
a.fill(value)用一个标量填充数组
Random¶
生成随机数¶
np.random.rand(d0, d1, ..., dn)生成均匀分布的随机数数组,取值范围为 [0, 1),若无参数则返回单个浮点数np.random.random(size=None)生成取值范围为 [0, 1) 的随机数np.random.random_sample(size=None)生成取值范围为 [0, 1) 的随机数np.random.uniform(low=0.0, high=1.0, size=None)生成均匀分布的随机数size若为 None,则返回一个数;若为整数或元组,则返回一个数组
np.random.randn(d0, d1, ..., dn)生成标准正态分布的随机数数组,若无参数则返回单个浮点数np.normal(loc=0.0, scale=1.0, size=None)生成标准分布的随机数
np.randint(low, high=None, size=None, dtype=int)返回指定范围内的随机整数high若为 None,则取值范围为 [0, low),否则为 [low, high)
随机选择¶
np.random.choice(a, size=None, replace=True, p=None)随机选择一维数组的元素a若为一维数组,则从中选择元素;若为整数,则视为使用np.arange(a)size若为 None,则只返回一个元素,否则返回指定形状的数组replace若为 True,则同一元素可被多次选择p一维数组,表示每个元素的概率,必须和为 1
随机排序¶
np.random.shuffle(x)沿第一个轴打乱序列顺序,原序列变化,返回 Nonenp.random.permutation(x)沿第一个轴随机排列序列,原序列不变,返回副本x若为数组,则会进行拷贝;若为整数,则视为使用np.arange(a)
Broadcasting¶
- 当对两个数组进行逐元素操作时,如
a * b,会从右到左比较它们的形状 - 若两个维度长度相同,或其中一个为 1,则称这两个维度兼容
- 若两个数组的维度数不同,则会在左边补全维度,长度全为 1
- 长度为 1 的维度会被拉伸复制,以匹配另一个数组对应位置的维度