numpy简介
Numpy:提供了一个在Python中做科学计算的基础库,重在数值计算,主要用于多维数组(矩阵)处理的库。用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效的多。本身是由C语言开发,是个很基础的扩展Python其余的科学计算扩展大部分都是以此为基础。高性能科学计算和数据分析的基础包。ndarray,多维数组(矩阵),具有矢量运算能力,快速、节省空间。矩阵运算,无需循环,可完成类似Matlab中的矢量运算线性代数、随机数生成。
1.NumPy数组的创建
numpy数组是一个多维的数组对象(矩阵),称为ndarray,具有矢量算术运算能力,并具有执行速度快和节省空间的特点。
注意:ndarray的下标从0开始,且数组里的所有元素必须是相同类型
ndarray属性
1.ndim属性:维度个数
2.shape属性:维度大小
3.dtype属性:数据类型
使用numpy生成简单的随机数[0,1)
# 当rand只有一个参数,表示生成的一维数组,参数表示数组的个数
>>> np.random.rand(1)
array([0.89203184])
>>> np.random.rand(2)
array([0.85662727, 0.64824804])
>>> np.random.rand(3)
array([0.77511044, 0.46904238, 0.00780967])
生成指定维数的数据,第一个参数表示第一维度中数组的个数,第二个参数表示第二维度数组的个数
# 导入numpy
import numpy as np
# 生成指定维度大小(3行4列)的随机多维浮点型数据(二维),rand固定区间0.0 ~ 1.0
>>> np.random.rand(3, 4)
array([[0.29215402, 0.68543925, 0.48303073, 0.00827797],
[0.98862213, 0.33065791, 0.3290673 , 0.18390224],
[0.49983908, 0.54521461, 0.73658653, 0.71214083]])
>>> np.random.rand(4, 3)
array([[0.85669123, 0.77398681, 0.43951684],
[0.37571215, 0.68408431, 0.93869697],
[0.27642824, 0.68777992, 0.27738744],
[0.47675432, 0.42990546, 0.21045483]])
2.ndarray数组创建
2-1.np.random. uniform()方法使用
生成指定维度大小(3行4列)的随机多维浮点型数据(二维),uniform()可以指定区间(-1, 5) ,arr = np.random.uniform(-1, 5, size = (3, 4)) 'size='可省略
# 这里uniform前两个参数表示规定的范围,size表示二维数组维度大小。
>>> np.random.uniform(-1,5,size=(3,4))
array([[ 3.85536452, 1.61365369, 1.16079153, 1.89497298],
[ 2.37728985, 2.35285825, 0.7788691 , -0.88447367],
[ 2.44396506, 2.44074519, 4.95173011, -0.13254573]])
>>> arr=np.random.uniform(-1,5,size=(2,4))
>>>print(arr)
array([[ 3.3124339 , 2.00718046, -0.18609511, 1.47210391],
[-0.17790801, 3.15517112, 0.523737 , 3.88743682]])
>>> print('维度个数: ', arr.ndim)
维度个数: 2
>>> print('维度大小: ', arr.shape)
维度大小: (2, 4)
>>> print('数据类型: ', arr.dtype)
数据类型: float64
2-2 指定大小的全0数组
指定大小的全0数组。注意:第一个参数是元组,用来指定大小,如(3, 4)。
# 例如:
>>> np.zeros((3, 4))
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
2-3.指定大小的全1数组
指定大小的全1数组。注意:第一个参数是元组,用来指定大小,如(3, 4)。
例如:
>>> np.ones((2, 3))
array([[1., 1., 1.],
[1., 1., 1.]])
2-4.初始化数组,不是总是返回全0,有时返回的是未初始的随机值(内存里的随机值)。
# 初始化数组
>>> np.empty((3, 3))
array([[1.12677977e-311, 7.28765190e-314, 9.21664466e-315],
[2.96439388e-323, 2.00196267e-313, 1.12889094e-311],
[1.12677977e-311, 3.39411166e-313, 2.61392709e+180]])
# 初始化数组的同时,指定数据类型
>>> np.empty((3, 3), int)
array([[ -21048624, 531, -21048568],
[ 531, -21075728, 531],
[ -21051408, 531, 1865310496]])
2-5. np.arange() 和 reshape()
arange() 类似 python 的 range() ,创建一个一维 ndarray 数组。reshape() 将 重新调整数组的维数。
# np.arange(),类似域python3中的range()
>>> np1=np.arange(10)
>>> np1
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np2=np.arange(5)
>>> np2
array([0, 1, 2, 3, 4])
#reshape()可以重新调整数组的维数,不过维度和维数要符合原来数组的个数
>>> np1.reshape(2,5)
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
# 假如np1为元素为10个数的数组,则只能重新调整为2维度且每个维度有5个元素,或者相反,其他的则无法转换。
>>> np1.reshape(3,3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: cannot reshape array of size 10 into shape (3,3)
>>>
2-6.Ndarray数据类型
2-6-1. dtype参数
指定数组的数据类型,类型名+位数,如float64, int32
#范例: 初始化3行4列数组,数据类型为float64
>>> zeros_float_arr = np.zeros((3, 4), dtype=np.float64)
>>> print(zeros_float_arr)
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
>>> print(zeros_float_arr.dtype)
float64
2-6-2.astype方法
转换数组的数据类型
# 将上个例子中的float类型的数组转换为int32
>>> zeros_int_arr = zeros_float_arr.astype(np.int32)
>>> print(zeros_int_arr)
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
>>> print(zeros_int_arr.dtype)
int32
2-7.ndarray的矩阵运算
数组是编程中的概念,矩阵、矢量是数学概念。在计算机编程中,矩阵可以用数组形式定义,矢量可以用结构定义!
2-7-1. 矢量运算:相同大小的数组间运算应用在元素上
# 示例:矢量与矢量运算
arr = np.array([[1, 2, 3], [4, 5, 6]])
>>> print("元素相乘:%s"%(arr*arr))
元素相乘:[[ 1 4 9]
[16 25 36]]
>>> print("矩阵相加:%s"%(arr+arr))
矩阵相加:[[ 2 4 6]
[ 8 10 12]]
2-7-2. 矢量和标量运算:
"广播" - 将标量"广播"到各个元素
示例:
# 矢量与标量运算
>>> arr = np.array([[1, 2, 3], [4, 5, 6]])
>>> print(1. / arr)
[[1. 0.5 0.33333333]
[0.25 0.2 0.16666667]]
>>> print(2. * arr)
[[ 2. 4. 6.]
[ 8. 10. 12.]]
2-7-3.ndarray的索引与切片
①. 一维数组的索引与切片与Python的列表索引功能相似
示例:
# 一维数组
>>> arr1 = np.arange(10)
>>> print(arr1)
[0 1 2 3 4 5 6 7 8 9]
>>> print(arr1[2:5])
[2 3 4]
②多维数组的索引与切片
arr[r1:r2, c1:c2],第一个r1:r2表示行,r1闭区间,r2为开区间(取不到),c1:c2表示列。
arr[1,1] 等价 arr[1][1]
[:] 代表某个维度的数据
示例:
# 多维数组
>>> arr2 = np.arange(12).reshape(3,4)
>>> print(arr2)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
>>> print(arr2[1])
[4 5 6 7]
>>> print(arr2[0:2, 2:])
[[2 3]
[6 7]]
>>> print(arr2[:, 1:3])
[[ 1 2]
[ 5 6]
[ 9 10]]
③. 条件索引
布尔值多维数组:arr[condition],condition也可以是多个条件组合。
注意,多个条件组合要使用 & | 连接,而不是Python的 and or。
示例:
# 条件索引 找出 data_arr 中 2005年后的数据
>>> data_arr = np.random.rand(3,3)
>>> print(data_arr)
[[0.27683791 0.79372477 0.22811993]
[0.10034831 0.57155537 0.70364493]
[0.68260789 0.80560241 0.86759406]]
>>> year_arr = np.array([[2000, 2001, 2000], [2005, 2002, 2009], [2001, 2003, 2010]])
>>> is_year_after_2005 = year_arr >= 2005
>>> print(is_year_after_2005,is_year_after_2005.dtype)
[[False False False]
[ True False True]
[False False True]] bool
>>>
>>> filtered_arr = data_arr[is_year_after_2005]
>>> print(filtered_arr)
[0.10034831 0.70364493 0.86759406]
>>> filtered_arr = data_arr[(year_arr <= 2005) & (year_arr % 2 == 0)]
>>> print(filtered_arr)
[0.27683791 0.22811993 0.57155537]
2-8.ndarray的转置
二维数组直接使用转换函数:transpose()
高维数组转换要指定维度编号参数 (0, 1, 2, …),注意参数是元组
示例代码:
>>> arr = np.random.rand(2,3) # 2x3 数组
>>> print(arr)
[[0.77952339 0.84146401 0.44259318]
[0.95848793 0.18365564 0.78185754]]
>>> print(arr.transpose()) # 转换为 3x2 数组
[[0.77952339 0.95848793]
[0.84146401 0.18365564]
[0.44259318 0.78185754]]
>>> arr3d = np.random.rand(2,3,4) 2x3x4 数组,2对应0,3对应1,4对应2
>>> print(arr3d)
[[[0.68059153 0.27698074 0.2297675 0.26879757]
[0.63490932 0.28204753 0.74448196 0.9033109 ]
[0.83402649 0.3721069 0.00605961 0.15624495]]
[[0.2279527 0.62085447 0.54684165 0.37898785]
[0.45453372 0.22428724 0.71416554 0.14174275]
[0.37052589 0.98551022 0.62010239 0.23599093]]]
>>> print(arr3d.transpose((1,0,2))) # 根据维度编号,转为为 3x2x4 数组
[[[0.68059153 0.27698074 0.2297675 0.26879757]
[0.2279527 0.62085447 0.54684165 0.37898785]]
[[0.63490932 0.28204753 0.74448196 0.9033109 ]
[0.45453372 0.22428724 0.71416554 0.14174275]]
[[0.83402649 0.3721069 0.00605961 0.15624495]
[0.37052589 0.98551022 0.62010239 0.23599093]]]
3.元素计算函数
ceil(): 向上最接近的整数,参数是 number 或 array
floor(): 向下最接近的整数,参数是 number 或 array
rint(): 四舍五入,参数是 number 或 array
isnan(): 判断元素是否为 NaN(Not a Number),参数是 number 或 array
multiply(): 元素相乘,参数是 number 或 array
divide(): 元素相除,参数是 number 或 array
abs():元素的绝对值,参数是 number 或 array
where(condition, x, y): 三元运算符,x if condition else y
示例:
# randn() 返回具有标准正态分布的序列。
>>> arr = np.random.randn(2,3)
>>> print(arr)
[[ 0.28346419 0.20901299 -0.23067226]
[-1.23499234 0.7704801 1.28326615]]
>>> print(np.ceil(arr)) # 向上取整
[[ 1. 1. -0.]
[-1. 1. 2.]]
>>> print(np.floor(arr)) # 向下取整
[[ 0. 0. -1.]
[-2. 0. 1.]]
>>> print(np.rint(arr)) # 四舍五入
[[ 0. 0. -0.]
[-1. 1. 1.]]
>>> print(np.isnan(arr)) # 是否是非数字
[[False False False]
[False False False]]
>>> print(np.multiply(arr, arr)) # 相乘
[[0.08035194 0.04368643 0.05320969]
[1.52520608 0.59363959 1.64677201]]
>>> print(np.divide(arr, arr)) # 相乘
[[1. 1. 1.]
[1. 1. 1.]]
>>> print(np.where(arr > 0, 1, -1)) # 三元运算
[[ 1 1 -1]
[-1 1 1]]
4.元素统计函数
np.mean(), np.sum():所有元素的平均值,所有元素的和,参数是 number 或 array
np.max(), np.min():所有元素的最大值,所有元素的最小值,参数是 number 或 array
np.std(), np.var():所有元素的标准差,所有元素的方差,参数是 number 或 array
np.argmax(), np.argmin():最大值的下标索引值,最小值的下标索引值,参数是 number 或 array
np.cumsum(), np.cumprod():返回一个一维数组,每个元素都是之前所有元素的 累加和 和 累乘积,参数是 number 或 array
多维数组默认统计全部维度,axis参数可以按指定轴心统计,值为0则按列统计,值为1则按行统计。
>>> arr = np.arange(12).reshape(3,4)
>>> print(arr)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
>>> print(np.sum(arr)) # 所有元素的和
66
>>> print(np.sum(arr, axis=0)) # 数组的按列统计和
[12 15 18 21]
>>> print(np.sum(arr, axis=1)) # 数组的按行统计和
[ 6 22 38]
>>> print(np.cumsum(arr)) # 返回一个一维数组,每个元素都是之前所有元素的 累加和
[ 0 1 3 6 10 15 21 28 36 45 55 66]
>>> arr = np.random.randint(0,10,(3,4))
>>> print(arr)
[[1 5 9 7]
[6 0 0 8]
[9 3 5 1]]
>>> print(np.mean(arr)) # 求所有元素的平均值
4.5
>>> print(np.sum(arr)) # 所有元素的和
54
>>> print(np.max(arr)) # 最大元素的值
9
>>> print(np.min(arr)) # 最小元素的值
0
#方差和标准差:衡量数据和期望值之间的偏离值
#求方差:所有元素都和平均数的差的平方的平均数
>>> print(np.var(arr))
10.75
#求标准差:方差的平方根
>>> print(np.std(arr))
3.278719262151
#求最大值和最小值的索引下标
#如果是多维数组,将多维数组合并成一维数组,再找出最大值索引下标
>>> arr = np.arange(10)
>>> print(arr)
[0 1 2 3 4 5 6 7 8 9]
>>> print(np.argmax(arr))
9
>>> print(np.argmin(arr))
0
#返回一维数组,数组每个元素都是之前每个元素的累加和
>>> print(np.cumsum(arr))
[ 0 1 3 6 10 15 21 28 36 45]
#返回一个一维数组,数组的每一个元素都是之前所有元素的累加积
>>> print(np.cumprod(arr))
[0 0 0 0 0 0 0 0 0 0]
5.元素判断函数
np.any(): 至少有一个元素满足指定条件,返回True
np.all(): 所有的元素满足指定条件,返回True
>>> arr = np.random.randn(2,3)
>>> print(arr)
[[-1.00819042 -0.4116328 -0.0563122 ]
[-0.71247075 0.37296051 0.62164402]]
>>> print(np.any(arr > 0))
True
>>> print(np.all(arr > 0))
False
6.元素去重排序函数
np.unique():找到唯一值并返回排序结果,类似于Python的set集合
>>> arr = np.array([[1, 2, 1], [2, 3, 4]])
>>> print(arr)
[[1 2 1]
[2 3 4]]
>>> print(np.unique(arr))
[1 2 3 4]
小结
Ndarray数组的创建
随即创建和序列创建
Ndarray矩阵运算
适量运算、矢量和标量运算,切片
元素计算函数
元素统计函数
元素判断函数
元素去重排序函数