简介
- 强大的N维数组对象:ndarray
- 对数组结构数据进行计算(不用遍历循环)
- 具备随机数、线性代数、傅里叶变化等功能
基础数据结构
import numpy as np
# 创建一个数组, 数组由数据和描述数组的元数据组成
ar = np.array([1, 2, 3, 4, 5, 6, 7])
ar1 = np.arange(7) # 返回0到6, 整型
ar2 = np.arange(7.0) # 返回0.0-6.0, 浮点型
ar3 = np.linspace(1.0, 7.0, num=5) # 返回[start, end]上计算num个均匀间隔的样本
ar4 = np.linspace(1.0, 7.0, num=5, endpoint=False) # endpoint为真,则停止是最后一个样本; 否则,不包括在内。默认值是True。
ar5 = np.linspace(1.0, 7.0, num=5, retstep=True) # retstep为真,则返回2个元素的元组,第1个元素为array, 第2个元素为步长实际值。
ar6 = np.zeros(7) # 生成7个元素全为0的一维数组
ar7 = np.zeros((2,5)) # 生成2*5个元素全为0的二维数组
ar8 = np.ones(7) # 生成7个元素全为1的一维数组
ar9 = np.ones((2, 5)) # 生成2*5个元素全为1的二维数组
ar10 = np.eye(5) # 生成对角线全为1的方阵
# ar元数据
print(ar.ndim) # 数组维度个数
print(ar.shape) # 数组的维度, shape为(n, m)
print(ar.size) # 数组的元素总数, 对于n行m列的数组, 元素总数为n*m
print(ar.dtype) # 数组中元素类型
print(ar.itemsize) # 数组中每个元素字节大小, int32为4字节, float64为8字节
索引及切片
import numpy as np
# 一维数组索引及切片
ar = np.arange(20)
ar[2]
ar[3:6] # 获取[3,6)的结果
#二维数组索引及切片
br = np.arange(20).reshape(4, 5)
br[2] # 获取下一个维度的元素,所以是一维数组
br[2][1] # 二次索引,得到一维数组中一个值
br[2, 1] # 切片数组中第2行,第1列的值
br[1:3] # 切片为两个一维数组组成的二维数组
br[:2, 1:] # 切片数组中的1、2行, 2、3、4、5列
# 布尔型索引及切片
cr = np.arange(12).reshape(3, 4)
i = np.array([True, False, True])
j = np.array([True, True, False, False])
cr[i, :] # 在第一维度做判断,保留字段为True的行
cr[:, j] # 在第二维度做判断,保留字段为True的行
随机数
import numpy as np
# 生成标准正太分布的4*4样本值
a = np.random.normal(size=(4,4))
# 生成[0,1)之间的均匀分布随机浮点数或者N维浮点数组
a = np.random.rand() # 随机浮点数
b = np.random.rand(2,3) # 随机2维浮点数组
# 生成[0,1)之间正太分布的样本值, 这里与np.random.normal区别主要是其样本不是标准正太
c = np.random.randn(4, 4)
# 生成一个随机整数或者N维整数数组,取[low, high)之间随机整数,若high为None,则取[0,low)之间随机整数
d = np.random.randint(2) # 生成1个[0,2)之间随机整数
e = np.random.randint(2, size=5) # 生成5个[0,2)之间随机整数
f = np.random.randint(2, 6, size=5) # 生成5个[2,6)之间随机整数
g = np.random.randint(2, size=(2,3)) # 生成[0,2)之间随机整数数组,shape为2*3
h = np.random.randint(2,6,(2,3) # 生成[2,6)之间随机整数数组,shape为2*3
# 设置随机种子,可以让每次运行随机数结果一样, 注意是代码重复运行时随机数结果一样,不是重新再写行代码运行
rng = np.random.RandomState(1)
i = rng.randn(3,2)
通用函数
import numpy as np
# 矩阵转置
a = np.arange(60).reshape(3,4,5)
b = a.T # shape为(5*4*3)
# 更改对象为新的数组,如有必要可重复填充所需数量的元素。注意resize函数没有返回值
c = np.arange(45)
c.resize(3,4,5)
# 数组复制 平均值 求最大值 求最小值 求标准差 求方差 求和
d = a.copy() c.mean() c.max() c.min() c.std() c.var() c.sum()
# 按列求和
np.sum(c, axis = 0)
# 排序
np.sort(np.array([1,4,3,2,5,6]))
# 数组元素类型转换
e = d.astype(np.float64)
# hstack对于一维数组是直接拼接,若是多维数组则是最后一个维度的拼接
a = np.arange(5) # [0 1 2 3 4]
b = np.arange(5, 9) # [5 6 7 8]
ar = np.hstack((a,b)) # [0 1 2 3 4 5 6 7 8]
c = np.arange(20).reshape(4,5)
d = np.arange(12).reshape(4,3)
e = np.hstack((c,d)) # 最后一个维度的拼接,最终结果shape为(4,8)
# vstack对于一维数组则是行与行的拼接,若是多维数组则是第一个维度的拼接
a = np.array([0 1 2 3 4])
b = np.array([5 6 7 8 9])
e = np.vstack((a,b)) # [[0 1 2 3 4],[5 6 7 8 9]]
# stack拼接,按照axis值取拼接
a = np.arange(5)
b = np.arange(5, 10)
ar1 = np.stack((a,b)) # 默认axis = 0, [[0 1 2 3 4] [5 6 7 8 9]]
ar2 = np.stack((a,b), axis = 1) # [[0 5] [1 6] [2 7] [3 8] [4 9]]