Numpy 基础快速了解和查询
numpy 是 python 的强大科学计算库, 它让 python 处理数据, 进行科学计算变得极其便捷, 高效
一, N 维数组 ndarray 对象
1, ndaraay 介绍
ndarray 是具有相同类型和大小的项目的多维容器, 它的数据存储效率和输入输出性能远远优于 python 中等价的数据结构
1.01, 理解 ndarray
创建 ndarray: np.array()
, np.ndarray()
, 下面只介绍 3 维以下数组, 理解它们的结构
import numpy as np
# 一维
a = np.array((2,3))
# 二维,2 行 3 列
b = np.ndarray((2,3))
a
array([2, 3])
b
array([[0., 0., 0.],
[0., 0., 0.]])
a.dtype, b.dtype # 类型
(dtype('int32'), dtype('float64'))
c = np.array((1,'2'))
c
array(['1', '2'], dtype='<U11')
type(c), type(c[0])
(numpy.ndarray, numpy.str_)
可见, ndarray 对象中的元素类型只有一种, 如上例,都统一成 Unicode, 元素位长是 11, 所以说 ndarray 是一个具有相同类型和大小的项目的多维容器
一维就是一行,二维就像一个表格, 横着是一行, 竖着是一列
# 三维
np.ndarray((3, 3, 3))
array([[[6.23042070e-307, 7.56587584e-307, 1.37961302e-306],
[6.23053614e-307, 6.23053954e-307, 9.34609790e-307],
[8.45593934e-307, 9.34600963e-307, 9.34598925e-307]],
[[1.42418715e-306, 1.95819401e-306, 1.37961370e-306],
[6.23054633e-307, 9.34598926e-307, 6.89804132e-307],
[9.34598926e-307, 8.01091099e-307, 1.24610927e-306]],
[[8.90094053e-307, 1.02361342e-306, 7.56593017e-307],
[1.60219035e-306, 8.90111708e-307, 6.89806849e-307],
[9.34601642e-307, 1.42410974e-306, 5.97819431e-322]]])
三维类似一个 excel 文件里的多个表格
1.02, ndarray 对象计算的优势
用实例来对比利用 ndarray 进行计算的优势
import random
import time
# 假设有如下列表和 array, 使其中每个数都变成它的平方
a1 = [random.random() for i in range(100000000)]
# a2 = np.array(a1)
t1 = time.time()
b = [i**2 for i in a1]
t2 = time.time()
a2 = np.array(a1)
c = a2**2
t3 = time.time()
print(t2 - t1, t3 - t2, sep='\n')
15.133688688278198
4.770834445953369
差距非常明显(如果 a2 在计算之前就已经是 ndarray 对象会更明显), numpy 有其自身机制(广播)实现快速计算
1.03, ndarray 的数据类型和常量
ndarray 对象数据的数据类型有 bool
, int
, float
, U
(字符串), O
(python 对象)等, 查看数据类型用
dtype
import numpy as np
a = np.array([1, 'a', np.nan])
a.dtype, a[0].dtype, a[2].dtype
(dtype('<U32'), dtype('<U1'), dtype('<U3'))
np.array(True).dtype
dtype('bool')
np.array(123456).dtype
dtype('int32')
np.array(3.1415926).dtype
dtype('float64')
np.array(list).dtype
dtype('O')
ndarray 对象数据的常量有 pi
, e
, nan
(空值), inf
(无穷大)等
np.pi
3.141592653589793
np.e
2.718281828459045
np.nan
nan
np.inf
inf
2, ndarray 的属性
常用 ndarray 对象的属性
a = np.array([[1, 2, 3], [4, 5, 6]])
a
array([[1, 2, 3],
[4, 5, 6]])
查看数组形状 (行, 列)
, 这在数据处理和计算时非常有用, 例如遍历出所有行或列
a.shape
(2, 3)
# 遍历所有列
for i in range(a.shape[1]):
print(a[:, i])
[1 4]
[2 5]
[3 6]
查看数组维度
a.ndim
2
查看数组元素个数
a.size
6
查看数组类型
a.dtype
dtype('int32')
查看数组元素的大小, 字节为单位
a.itemsize
4
数组转置, 就是行列互换
a.T
array([[1, 4],
[2, 5],
[3, 6]])
二, ndarray 对象的切片操作
1, 切片取值
ndarray 的切片操作和 python 类似, 一维切片 [起始:结束:步长]
, 二维的切片 [起始行:结束行:步长, 起始列:结束列:步长]
或 [[行, ...], [列, ...]]
a = np.arange(20)
a.shape = (4, 5)
a
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
# 第一行的第 1, 3, 5 个数
a[0][0::2]
array([0, 2, 4])
a[2, 3]
13
a[0:2, 1:5]
array([[1, 2, 3, 4],
[6, 7, 8, 9]])
a[0:3:2, 0:4:2]
array([[ 0, 2],
[10, 12]])
a[[1, 3], 0:3]
array([[ 5, 6, 7],
[15, 16, 17]])
还可以通过逻辑运算取值
# 取出数组中的数翻倍之后小于 15 的数
# 结果展开为 1 维
a[a * 2 < 15]
array([0, 1, 2, 3, 4, 5, 6, 7])
# & 与
a[(a < 5) & (a > 1)]
array([2, 3, 4])
# | 或
a[(a < 3) | (a > 15)]
array([ 0, 1, 2, 16, 17, 18, 19])
# ~ 非
a[~ (a > 3)]
array([0, 1, 2, 3])
2, 利用切片修改值
切片修改值, 其实就是将取到的值重新赋值
a[~ (a > 3)] = 1
a
array([[ 1, 1, 1, 1, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
# 将 1 修改为 nan, nan 是 float 类型,
# 保证类型一致性, 需要将 a 转为 float
a = a.astype(float)
a[a == 1] = np.nan
a
array([[nan, nan, nan, nan, 4.],
[ 5., 6., 7., 8., 9.],
[10., 11., 12., 13., 14.],
[15., 16., 17., 18., 19.]])
# 任何 nan 都不等于 nan,
# 利用此特性取 nan, 或非 nan 的数
a[a != a], a[a == a]
(array([nan, nan, nan, nan]),
array([ 4., 5., 6., 7., 8., 9., 10., 11., 12., 13., 14., 15., 16.,
17., 18., 19.]))
# 交换行, 交换列
a[[0, 3], :] = a[[3, 0], :]
a[:, [4, 0]] = a[:, [0, 4]]
a
array([[19., 16., 17., 18., 15.],
[ 9., 6., 7., 8., 5.],
[14., 11., 12., 13., 10.],
[ 4., nan, nan, nan, nan]])
三, ndarray 对象的运算及其方法
1, ndarray 的运算
numpy 在运算时, 会通过广播机制, 将运算相对应到每个元素上:
数和数组计算, 数会和数组中的每一个元素进行计算
# 方法 reshape 用于设置数组的形状, 后面会说
import numpy as np
a = np.arange(9).reshape((3, 3))
a
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
b = -a * 2
b
array([[ 0, -2, -4],
[ -6, -8, -10],
[-12, -14, -16]])
相同形状的多维数组之间的运算, 对应位置的元素进行计算
a + b
array([[ 0, -1, -2],
[-3, -4, -5],
[-6, -7, -8]])
# 行相同
a[1] + (a + b)
array([[ 3, 3, 3],
[ 0, 0, 0],
[-3, -3, -3]])
二维一列的数组和多维数组之间的运算, 需要列元素个数相同, 然后一一对应并广播计算
# 列相同
# a 的列取出来成了一维, 需要转为二维
a[:, 1].reshape((3, 1)) + (a + b)
array([[ 1, 0, -1],
[ 1, 0, -1],
[ 1, 0, -1]])
2, 常用 ndarray 对象的方法
就是直接用 ndarray 对象调用的方法
2.01, 形状操作
flatten 或 ravel 将多维数组展开为一维, 不改变原数组
a
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
# 默认参数 'C' 以行展开, 'F' 以列展开
display(a.flatten())
display(a.flatten('F'))
a.ravel('F')
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
array([0, 3, 6, 1, 4, 7, 2, 5, 8])
array([0, 3, 6, 1, 4, 7, 2, 5, 8])
reshape 修改数组的形状, 不改变原数组, 行列数相乘要等于元素总数; resize 就地修改原数组形状
# 默认以行展开修改
import numpy as np
b = np.arange(12).reshape((3, 4))
display(b)
b.reshape((2, 6), order='F')
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
array([[ 0, 8, 5, 2, 10, 7],
[ 4, 1, 9, 6, 3, 11]])
# 就地修改 b
display(b)
b.resize((4, 3))
b
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
2.02, 转换类型
tolist 数组转列表
b.tolist()
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]]
astype 改变数组类型
b.astype(float)
array([[ 0., 1., 2.],
[ 3., 4., 5.],
[ 6., 7., 8.],
[ 9., 10., 11.]])
2.03, 修改, 排序及查找
fill 给原数组重新填值, 类型不变
b[0].fill(2.01)
b
array([[ 2, 2, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
sort 就地排序, 参数 0 将列排序, 1 将行排序
a = np.array([[3, 0, 5], [8, 4, 6], [0, 7, 3]])
a.sort(0)
a
array([[0, 0, 3],
[3, 4, 5],
[8, 7, 6]])
a.argsort() # 返回排序后的索引位置
array([[0, 1, 2],
[0, 1, 2],
[2, 1, 0]], dtype=int64)
nonzero 返回非零元素的索引, 行坐标一个数组, 列坐标一个数组
a.nonzero()
(array([0, 1, 1, 1, 2, 2, 2], dtype=int64),
array([2, 0, 1, 2, 0, 1, 2], dtype=int64))
2.04, 计算
max 返回最大值, 给定轴将返回给定轴的最大值, argmax 返回索引, 与之对应的还有最小min 和 argmin
# 参数 0 列的最大值, 参数 1 行的最大值
a = np.arange(1.01, 13.13, 1.01).reshape(3, 4)
print(a)
print(a.max(), a.max(axis=0), a.max(axis=1))
[[ 1.01 2.02 3.03 4.04]
[ 5.05 6.06 7.07 8.08]
[ 9.09 10.1 11.11 12.12]]
12.12 [ 9.09 10.1 11.11 12.12] [ 4.04 8.08 12.12]
# 参数 0 行索引, 1 列索引
print(a.argmax(), a.argmax(0), a.argmax(1))
11 [2 2 2 2] [3 3 3]
ptp 返回极值或给定轴的极值(最大-最小)
a.ptp(), a.ptp(axis=0), a.ptp(axis=1)
(11.11, array([8.08, 8.08, 8.08, 8.08]), array([3.03, 3.03, 3.03]))
clip 返回指定值之间的数组, 小于或大于指定值的, 用指定值填充
a.clip(2, 6)
array([[2. , 2.02, 3.03, 4.04],
[5.05, 6. , 6. , 6. ],
[6. , 6. , 6. , 6. ]])
round 四舍五入到指定位数
a.round(1)
array([[ 1. , 2. , 3. , 4. ],
[ 5. , 6.1, 7.1, 8.1],
[ 9.1, 10.1, 11.1, 12.1]])
sum 求和, cumsum 累积求和
print(a.sum()) # 总和
print(a.sum(0)) # 列求和
print(a.sum(1)) # 行求和
78.78
[15.15 18.18 21.21 24.24]
[10.1 26.26 42.42]
print(a.cumsum()) # 全部累积
print(a.cumsum(0)) # 列累积
print(a.cumsum(1)) # 行累积
[ 1.01 3.03 6.06 10.1 15.15 21.21 28.28 36.36 45.45 55.55 66.66 78.78]
[[ 1.01 2.02 3.03 4.04]
[ 6.06 8.08 10.1 12.12]
[15.15 18.18 21.21 24.24]]
[[ 1.01 3.03 6.06 10.1 ]
[ 5.05 11.11 18.18 26.26]
[ 9.09 19.19 30.3 42.42]]
类似还有 mean 均值, var 方差, std 标准差, prod 乘积, cumprod 累积乘积, 不在一一举例
all 数组所有元素都判断为 True, 返回 True, 而 any 只要任何一个 True 返回 True
a = np.array([1, 2])
b = np.array([0, 0])
a.all(), b.all(), a.any(), b.any()
(True, False, True, False)
四, 创建或生成 ndarray 对象
1, 生成随机数
利用 numpy 生成随机数的模块 random, 创建数据来作例子非常有用. 先研究一下这个模块, 再研究通用函数
import numpy as np
# random 生成 0 ~ 1 之间的随机数
display(1 + np.random.random(3))
np.random.random((2,3)) * 10
array([1.33317465, 1.03829035, 1.19401465])
array([[2.13175522, 1.41162992, 9.67005144],
[0.03480687, 4.63431381, 5.88380759]])
# 同上, 传参方式不一样
display(np.random.rand(3))
np.random.rand(1, 3, 2)
array([0.60852454, 0.70296852, 0.31611002])
array([[[0.76136557, 0.14321424],
[0.01322461, 0.89676522],
[0.71400795, 0.00755323]]])
# 返回指定范围内的随机整数 [a,b) 包含 a 不包含 b, 不指定 b 则 [0,a)
display(np.random.randint(3, size=3))
np.random.randint(1, 4, (2, 3))
array([0, 2, 0])
array([[2, 2, 1],
[3, 2, 3]])
# 生成的随机数服从标准正态分布
display(np.random.randn(3))
np.random.randn(3, 2)
array([-1.46427887, 0.87862733, -0.98698207])
array([[ 0.51350851, -0.67478546],
[ 0.543379 , 0.63665877],
[-1.31200705, -0.30697352]])
类似还有拉普拉斯分布 laplace, 逻辑分布 logistic, 正态分布 normal 等, 可以设置分布的参数
np.random.logistic(5, 2, (2, 3))
array([[2.40647744, 5.62327677, 5.8642342 ],
[4.10741882, 7.65751053, 4.99483744]])
# 打乱原数组元素, 二维时只能打乱行的顺序
a = np.arange(5)
b = np.arange(9).reshape(3, 3)
np.random.shuffle(a)
np.random.shuffle(b)
a, b
(array([0, 2, 4, 1, 3]),
array([[3, 4, 5],
[6, 7, 8],
[0, 1, 2]]))
# 从一个一维数组里随机选择指定数量的元素,
# 或随机生成 0 到指定整数(不包含)的随机数
# replace=True 元素可以重复选择(默认)
display(np.random.choice(5, 5, replace=False))
np.random.choice(a, (2, 3))
array([4, 3, 1, 2, 0])
array([[3, 2, 2],
[3, 0, 0]])
2, 创建数组
np.empty((2, 3))
array([[2.40647744, 5.62327677, 5.8642342 ],
[4.10741882, 7.65751053, 4.99483744]])
a = np.eye(3)
a
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
np.ones((2, 3))
array([[1., 1., 1.],
[1., 1., 1.]])
np.ones_like(a)
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
np.zeros((2, 3))
array([[0., 0., 0.],
[0., 0., 0.]])
np.full((2, 3), 3)
array([[3, 3, 3],
[3, 3, 3]])
np.array(list)
array(<class 'list'>, dtype=object)
np.arange(3)
array([0, 1, 2])
np.linspace(1, 9, 3)
array([1., 5., 9.])
np.logspace(1, 3, 3)
array([ 10., 100., 1000.])
五, 常用的通函数及 API
numpy 调用, 用来操作 ndarray 对象的函数
1, 修改数组形状
reshape 与 ndarray 对象的方法一样, 另有 resize 只能按行展开
a = np.random.choice(5, (2, 3))
display(a)
np.reshape(a,(1, 6), 'F')
array([[0, 2, 2],
[4, 1, 2]])
array([[0, 4, 2, 1, 2, 2]])
np.resize(a, (1, 6))
array([[0, 2, 2, 4, 1, 2]])
ravel 展开为一维(ndarray 对象也有该方法)
np.ravel(a, 'F')
array([0, 4, 2, 1, 2, 2])
2, 组合数组
concatenate, hstack, vstack 连接数组
# axis=0, 行方向连接(默认), axis=1, 列方向连接
b = np.random.choice(6, (2, 3))
np.concatenate((a, b), axis=1)
array([[0, 2, 2, 2, 5, 5],
[4, 1, 2, 2, 5, 2]])
np.hstack((a, b)) # 列方向连接
array([[0, 2, 2, 2, 5, 5],
[4, 1, 2, 2, 5, 2]])
np.vstack((a, b)) # 行方向连接
array([[0, 2, 2],
[4, 1, 2],
[2, 5, 5],
[2, 5, 2]])
stack 堆叠数组, 堆叠后维度增加 1
# axis=0, 行方向堆叠(默认), axis=1, 列方向堆叠
np.stack((a[0], b[0])), np.stack((a[0], b[0]), axis=1)
(array([[0, 2, 2],
[2, 5, 5]]),
array([[0, 2],
[2, 5],
[2, 5]]))
3, 拆分数组
split, hsplit, vsplit 将数组拆分, 返回为列表
np.split(a, 2), np.vsplit(a, 2), np.hsplit(a, 3)
([array([[0, 2, 2]]), array([[4, 1, 2]])],
[array([[0, 2, 2]]), array([[4, 1, 2]])],
[array([[0],
[4]]),
array([[2],
[1]]),
array([[2],
[2]])])
4, 添加, 删除元素
delete 删除指定索引的元素, 行或列
a, np.delete(a, 1) # 删除第 2 个元素
(array([[0, 2, 2],
[4, 1, 2]]),
array([0, 2, 4, 1, 2]))
# 删除第 2 行, 或第 2 列
np.delete(a, 1, axis=0), np.delete(a, 1, axis=1)
(array([[0, 2, 2]]),
array([[0, 2],
[4, 2]]))
insert 在指定索引前插入元素, 行或列
np.insert(a, 1, 9)
array([0, 9, 2, 2, 4, 1, 2])
np.insert(a, 1, 9, axis=0), np.insert(a, 1, [1, 2, 3], axis=0)
(array([[0, 2, 2],
[9, 9, 9],
[4, 1, 2]]),
array([[0, 2, 2],
[1, 2, 3],
[4, 1, 2]]))
np.insert(a, 1, [1, 3], axis=1)
array([[0, 1, 2, 2],
[4, 3, 1, 2]])
append 在数组末尾(或行,列末尾)加入元素, 行或列(维数必须相同)
np.append(a, 2)
array([0, 2, 2, 4, 1, 2, 2])
np.append(a, [[2, 2, 2]], axis=0), np.append(a, [[2], [2]], axis=1)
(array([[0, 2, 2],
[4, 1, 2],
[2, 2, 2]]),
array([[0, 2, 2, 2],
[4, 1, 2, 2]]))
unique 查找数组中的唯一值
a = np.random.choice(4, (2, 3))
display(a)
np.unique(a,return_index=True,
return_inverse=True,
return_counts=True, axis=None)
array([[3, 0, 3],
[1, 3, 1]])
(array([0, 1, 3]),
array([1, 3, 0], dtype=int64),
array([2, 0, 2, 1, 2, 1], dtype=int64),
array([1, 2, 3], dtype=int64))
5, 重新排列元素
flip, fliplr, flipud 翻转数组
np.flip(a), np.flip(a, 0), np.flip(a, 1)
(array([[1, 3, 1],
[3, 0, 3]]),
array([[1, 3, 1],
[3, 0, 3]]),
array([[3, 0, 3],
[1, 3, 1]]))
sort 排序数组元素
np.sort(a)
array([[0, 3, 3],
[1, 1, 3]])
roll 滚动数组元素
np.roll(a, 1), np.roll(a, 1, axis=0), np.roll(a, 1, axis=1)
(array([[1, 3, 0],
[3, 1, 3]]),
array([[1, 3, 1],
[3, 0, 3]]),
array([[3, 3, 0],
[1, 1, 3]]))
6, 常用数学运算函数
import numpy as np
# 固定随机种子
np.random.seed(0)
a = np.random.randint(1, 6, (3, 4))
b = np.arange(12).reshape((3, 4))
a, b
(array([[5, 1, 4, 4],
[4, 2, 4, 3],
[5, 1, 1, 5]]),
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]]))
np.power(b, a) # b**a
array([[ 0, 1, 16, 81],
[ 256, 25, 1296, 343],
[ 32768, 9, 10, 161051]], dtype=int32)
np.divmod(b, a) # 商 和 余
(array([[ 0, 1, 0, 0],
[ 1, 2, 1, 2],
[ 1, 9, 10, 2]], dtype=int32),
array([[0, 0, 2, 3],
[0, 1, 2, 1],
[3, 0, 0, 1]], dtype=int32))
np.fabs(-a), np.abs(-a) # 取绝对值
(array([[5., 1., 4., 4.],
[4., 2., 4., 3.],
[5., 1., 1., 5.]]),
array([[5, 1, 4, 4],
[4, 2, 4, 3],
[5, 1, 1, 5]]))
c = np.random.rand(3, 4) * 10
display(c)
np.rint(c) # 舍入最接近的整数
array([[3.83441519, 7.91725038, 5.2889492 , 5.68044561],
[9.25596638, 0.71036058, 0.871293 , 0.20218397],
[8.32619846, 7.78156751, 8.70012148, 9.78618342]])
array([[ 4., 8., 5., 6.],
[ 9., 1., 1., 0.],
[ 8., 8., 9., 10.]])
np.exp(a).round(1) # np.e ** a
array([[148.4, 2.7, 54.6, 54.6],
[ 54.6, 7.4, 54.6, 20.1],
[148.4, 2.7, 2.7, 148.4]])
b = np.exp2(a) # 2**a
a, b
(array([[5, 1, 4, 4],
[4, 2, 4, 3],
[5, 1, 1, 5]]),
array([[32., 2., 16., 16.],
[16., 4., 16., 8.],
[32., 2., 2., 32.]]))
np.log(a)
np.log2(a)
np.log10(a)
np.sqrt(a) # 开根号
np.gcd(a, b.astype(int)) # 最大公约数
np.lcm(a, b.astype(int)) # 最小公倍数
array([[160, 2, 16, 16],
[ 16, 4, 16, 24],
[160, 2, 2, 160]])
np.sin(a)
np.cos(a)
np.tan(a)
array([[-3.38051501, 1.55740772, 1.15782128, 1.15782128],
[ 1.15782128, -2.18503986, 1.15782128, -0.14254654],
[-3.38051501, 1.55740772, 1.55740772, -3.38051501]])
np.greater(a, b) # a > b
np.less(a, b) # a < b
a != b # np.not_equal(a, b)
(a > 2) | ~(b < 5) # np.logical_or(a>2, ~(b<5))
array([[ True, False, True, True],
[ True, False, True, True],
[ True, False, False, True]])
# 两者取其大, 同 np.fmax(a*5, b) 对应还有 minimum, fmin
np.maximum(a*5, b)
array([[32., 5., 20., 20.],
[20., 10., 20., 15.],
[32., 5., 5., 32.]])
np.isinf(a) # 判断是否正负无穷大
np.isnan(a) # 判断是否 nan
array([[False, False, False, False],
[False, False, False, False],
[False, False, False, False]])
np.modf(c) # 分别返回小数和整数部分
(array([[0.83441519, 0.91725038, 0.2889492 , 0.68044561],
[0.25596638, 0.71036058, 0.871293 , 0.20218397],
[0.32619846, 0.78156751, 0.70012148, 0.78618342]]),
array([[3., 7., 5., 5.],
[9., 0., 0., 0.],
[8., 7., 8., 9.]]))
np.fmod(b, a) # 返回余数
array([[2., 0., 0., 0.],
[0., 0., 0., 2.],
[2., 0., 0., 2.]])
c = np.random.rand(3, 4) * 10
display(c)
np.floor(c) # 向下取整
np.ceil(c) # 向上取整
array([[7.99158564, 4.61479362, 7.80529176, 1.18274426],
[6.39921021, 1.43353287, 9.44668917, 5.21848322],
[4.1466194 , 2.64555612, 7.74233689, 4.56150332]])
array([[ 8., 5., 8., 2.],
[ 7., 2., 10., 6.],
[ 5., 3., 8., 5.]])
7, 字符串操作
字符串的操作函数, 和 python 的操作函数相似, 只是 numpy 作用到整个数组上
a = np.array([['a', 'b', 'c'], [20, 19, 18]])
np.char.add(a, a)
array([['aa', 'bb', 'cc'],
['2020', '1919', '1818']], dtype='<U22')
np.char.multiply(a, 3)
array([['aaa', 'bbb', 'ccc'],
['202020', '191919', '181818']], dtype='<U33')
# 将每一个制表符替换成指定个数的空格
b = np.array('\ta\t\tbc\td')
np.char.expandtabs(b, 1)
array(' a bc d', dtype='<U8')
np.char.replace(a, '1', '2') # 替换
array([['a', 'b', 'c'],
['20', '29', '28']], dtype='<U2')
np.char.title(a)
array([['A', 'B', 'C'],
['20', '19', '18']], dtype='<U11')
b = np.char.zfill(a, 4)
b
array([['000a', '000b', '000c'],
['0020', '0019', '0018']], dtype='<U4')
np.char.count(b, '0') # 0 出现的次数
array([[3, 3, 3],
[3, 2, 2]])
np.char.str_len(a) # 字符串长度
array([[1, 1, 1],
[2, 2, 2]])
8, 索引与迭代
a = np.random.choice(4, (3, 4))
display(a)
np.nonzero(a) # 非 0 索引
array([[2, 0, 0, 0],
[1, 1, 2, 0],
[0, 1, 3, 0]])
(array([0, 1, 1, 1, 2, 2], dtype=int64),
array([0, 0, 1, 2, 1, 2], dtype=int64))
# 返回指定条件的元素的索引, 并可进行替换
# 不设条件, 和 nonzero 一样
np.where(a>0)
(array([0, 1, 1, 1, 2, 2], dtype=int64),
array([0, 0, 1, 2, 1, 2], dtype=int64))
# 大于 0 都换成 a, 否则都换成 b
np.where(a>0, 'a', 'b')
array([['a', 'b', 'b', 'b'],
['a', 'a', 'a', 'b'],
['b', 'a', 'a', 'b']], dtype='<U1')
np.nditer(a) # 将数组变成一个高效的迭代器
<numpy.nditer at 0x2b410944d50>
9, 统计运算函数
# 下述与 ndarray 对象直接调用的方法一样
a = np.random.rand(3, 4) * 5
np.all(a)
np.any(a)
np.max(a)
np.sum(a)
np.mean(a)
np.cumsum(a)
np.var(a)
np.std(a)
np.clip(a, 1, 3)
np.around(a, 2) # ndarray 对象的方法是 round
# 等等
array([[3.41, 1.8 , 2.19, 3.49],
[0.3 , 3.33, 3.35, 1.05],
[0.64, 1.58, 1.82, 2.85]])
任何数与 nan 计算都是 nan, 可以用相应的函数排除 nan
b = np.array([1, np.nan, 3, 4])
np.sum(b), np.nansum(b)
(nan, 8.0)
np.nancumsum(b)
array([1., 1., 4., 8.])