一、介绍
——NumPy库是高性能科学计算和数据分析的基础包,它是Pandas及其它各种工具的基础
——NumPy里的ndarry多维数组对象,与列表的区别是:
- 数组对象内的元素类型必须一样
- 数组大小不可修改
——数组对象的常用属性:
- T 数组的转置(在多维数组里,将列转成行,行转成列的操作)
- dtype 数据元素的数据类型
- size 数组元素的个数
- ndim 数组的维数
- shape 数组的维度大小
二、创建ndarray对象
1、基本创建数组的方法:
import numpy as np #首先需要导入numpy库 #创建一维的narray对象 a1 = np.array([1,2,3,4,5]) #一个列表 #创建二维的narray对象 a2 = np.array([[1,2,3,4,5],[6,7,8,9,10]]) # 一个列表里套两个列表 #创建多维对象以次类推
指定数据类型:dtype
a = np.array([2,23,4],dtype=np.int) print(a.dtype) # int 64 a = np.array([2,23,4],dtype=np.int32) print(a.dtype) # int32 a = np.array([2,23,4],dtype=np.float) print(a.dtype) # float64 a = np.array([2,23,4],dtype=np.float32) print(a.dtype) # float32
自带的几种数组创建方法:
1、zeros:创建全零数组
a = np.zeros((3,4)) # 数据全为0,3行4列
2、ones:创建全一数组, 同时也能指定这些特定数据的 dtype
:
a = np.ones((5,3),dtype = np.int) # 数据为1,5行3列
3、empty:创建全空数组, 其实每个值都是接近于零的数:
a = np.empty((2,2)) # 数据为empty,2行2列
4、arange:传值创建连续数组:
a = np.arange(10) # 默认从0开始到10(不包括10),步长为1 print(a) # 返回 [0 1 2 3 4 5 6 7 8 9] a = np.arange(5,20,2) # 从5开始到20(不包括20),步长为2 print(a) # 返回 [ 5 7 9 11 13 15 17 19]
5、reshape()
函数通常结合arange()
函数使用,改变数组的维度
# 将一维数组a变为3*4的数组 a=np.arange(12).reshape((3,4)) # 将a变回为一维数组 a.reshape((12,))
6、linspace()
函数跟arange()
函数相似,前两个参数指定序列的开头和结尾,第三个参数指定将数组拆分成几个
np.linspace(0,10,5) # array([ 0. , 2.5, 5. , 7.5, 10. ])
7、random()
函数使用随机数填充数组
# 生成一维数组 a = np.random.random(3) print(a) # array([ 0.0092522 , 0.44961339, 0.85684498]) # 生成多维数组 a = np.random.random((3,3)) print(a) # array([[ 0.50311642, 0.25961784, 0.30587642], [ 0.55388356, 0.92739877, 0.26140058], [ 0.63482092, 0.45938232, 0.84053653]])
# 生成的都是0~1范围的小数
三、数组基本操作
1、算术运算符
算术运算符可以用于数组和标量之间
>>> a=np.arange(4) >>> a array([0, 1, 2, 3]) >>> a+4 array([4, 5, 6, 7]) >>> a-4 array([-4, -3, -2, -1]) >>> a*4 array([ 0, 4, 8, 12]) >>> a/2 array([0, 0, 1, 1])
还可以用于两个数组之间,这两个数组的元素位置必须相同,也就是具有相同的型
>>> a=np.arange(4) >>> a array([0, 1, 2, 3]) >>> b=np.arange(4,8) >>> b array([4, 5, 6, 7]) >>> a+b array([ 4, 6, 8, 10]) >>> a-b array([-4, -4, -4, -4]) >>> a*b array([ 0, 5, 12, 21]) >>> a/b array([0, 0, 0, 0]) #整数相除只取商
>>> a**2
array([ 0, 1, 4, 9])
>>> a%b # 相除后取余数 array([ 0, 5, 12, 21])
对于多维数组是一样适用的,
>>> A=np.arange(9).reshape((3,3)) >>> A array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) >>> B=np.ones((3,3)) >>> B array([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]]) >>> A*B array([[ 0., 1., 2.], [ 3., 4., 5.], [ 6., 7., 8.]])
2、数组的索引与切片
A = np.arange(3,15).reshape((3,4)) """ array([[ 3, 4, 5, 6] [ 7, 8, 9, 10] [11, 12, 13, 14]]) 在这样的二维数组中,每一行有从0开始的索引,每一行里的元素也有自己的索引,所以: """ print(A[2]) # [11 12 13 14] print(A[2,2]) # 13
切片
# 数组也有类似列表的切片操作
A = np.arange(3,15).reshape((3,4)) """ array([[ 3, 4, 5, 6] [ 7, 8, 9, 10] [11, 12, 13, 14]]) """
print(A[1,0:2])
# [7,8]
print(A[0:2,1:3])
""" array([[4, 5] [8, 9] [12, 13]]) """
Numpy 的 copy & deepcopy:
= 的赋值方式会带有关联性:
import numpy as np a = np.arange(4) # array([0, 1, 2, 3]) b = a c = a d = b
改变a的第一个值,b
、c
、d
的第一个值也会同时改变。
a[0] = 11 print(a) # array([11, 1, 2, 3])
确认b
、c
、d
是否与a
相同。
print(b is a) # True print(c is a) # True print(d is a) # True
同样的,更改d
的值,a
、b
、c
也会改变。
d[1:3] = [22, 33] # array([11, 22, 33, 3]) print(a) # array([11, 22, 33, 3]) print(b) # array([11, 22, 33, 3]) print(c) # array([11, 22, 33, 3])
copy()
的赋值方式没有关联性
b = a.copy() # deep copy print(b) # array([11, 22, 33, 3]) a[3] = 44 print(a) # array([11, 22, 33, 44]) print(b) # array([11, 22, 33, 3])
3、矩阵常用函数
1)最大值最小值
import numpy as np a = np.array([[1,2,3],[4,5,6]]) print(a.max()) #获取整个矩阵的最大值 结果: 6 print(a.min()) #最小值,结果:1 # 可以指定关键字参数axis来获得行最大(小)值或列最大(小)值 # axis=0 行方向最大(小)值,即获得每列的最大(小)值 # axis=1 列方向最大(小)值,即获得每行的最大(小)值 # 例如 print(a.max(axis=0)) # 结果为 [4 5 6] print(a.max(axis=1)) # 结果为 [3 6] # 要想获得最大最小值元素所在的位置,可以通过argmax函数来获得 print(a.argmax(axis=1)) # 结果为 [2 2]
2)平均值
import numpy as np a = np.array([[1,2,3],[4,5,6]]) print(a.mean()) #结果为: 3.5 # 同样地,可以通过关键字axis参数指定沿哪个方向获取平均值 print(a.mean(axis=0)) # 结果 [ 2.5 3.5 4.5] print(a.mean(axis=1)) # 结果 [ 2. 5.]
3)方差:方差的函数为var()
,方差函数var()
相当于函数mean(abs(x - x.mean())**2)
,其中x为矩阵。
import numpy as np a = np.array([[1,2,3],[4,5,6]]) print(a.var()) # 结果 2.91666666667 print(a.var(axis=0)) # 结果 [ 2.25 2.25 2.25] print(a.var(axis=1)) # 结果 [ 0.66666667 0.66666667]
4)标准差:标准差的函数为std(),
std()
相当于sqrt(mean(abs(x - x.mean())**2))
,或相当于sqrt(x.var())
。
import numpy as np a = np.array([[1,2,3],[4,5,6]]) print(a.std()) # 结果 1.70782512766 print(a.std(axis=0)) # 结果 [ 1.5 1.5 1.5] print(a.std(axis=1)) # 结果 [ 0.81649658 0.81649658]
5)中值:中值指的是将序列按大小顺序排列后,排在中间的那个值,如果有偶数个数,则是排在中间两个数的平均值。
import numpy as np x = np.array([[1,2,3],[4,5,6]]) print(np.median(x)) # 对所有数取中值 # 结果 3.5 print(np.median(x,axis=0)) # 沿第一维方向取中值 # 结果 [ 2.5 3.5 4.5] print(np.median(x,axis=1)) # 沿第二维方向取中值 # 结果 [ 2. 5.]
6)求和:矩阵求和的函数是sum(),可以对行,列,或整个矩阵求和
import numpy as np a = np.array([[1,2,3],[4,5,6]]) print(a.sum()) # 对整个矩阵求和 # 结果 21 print(a.sum(axis=0)) # 对行方向求和 # 结果 [5 7 9] print(a.sum(axis=1)) # 对列方向求和 # 结果 [ 6 15]
7)累积和:
import numpy as np a = np.array([[1,2,3],[4,5,6]]) print(a.cumsum()) # 对整个矩阵求累积和 # 结果 [ 1 3 6 10 15 21] print(a.cumsum(axis=0)) # 对行方向求累积和 """ 结果[[1 2 4] [5 7 9]] """ print(a.cumsum(axis=1)) # 对列方向求累积和 """ 结果 [[ 1 3 6] [ 4 9 15]] """