【Python数据分析基础】Numpy常用的基础知识总结

本文基于*Python数据分析实战( by Fabio Nelli),Python数据分析(by Armando Fandango)*两本书中内容及个人经验总结,欢迎一起讨论数据分析和机器学习哇~

1.NumPy基本概念:

①NumPy库的基础:ndarray对象(n维数组),它是一种由同质元素组成的多维数组,数据类型由NumPy对象dtype来指定
②数组的型(shape):代码example.shape,返回一个包含行列数的元组如(2,3)
③数组的维统称为轴(axes),轴的数量称为秩(rank),代码example.ndim返回维(轴)数,维数是指行数,example.size返回数组的总元素个数。
④tolist()方法可以将Numpy数组转换成列表,用法:array_example.tolist()

2.创建数组的方法:

a = np.array([[1, 2], [3, 4]])
b = np.array(((1, 2), (3, 4))) #b等价于a
c = np.zeros((3, 3))
d = np.ones((2, 2))
e = np.random.random((1,3)) #返回1x3的矩阵,元素为0-1的随机数

3.数组运算方法

A = np.zeros((2, 2))
B = np.oness((2, 2))

#标量加法/乘法
C = (A + 1) * 2
#矩阵的元素间运算
D = (A + B) * B
#矩阵乘法
E = np.dot(A, B)
F = A.dot(B) #F等价于E
#自增
G += 2 #也可以用*等符号
#通用函数
H = np.sqrt(A) #还有log,sin,exp等
#聚合函数
I = A.sum() #还有A.min,A.mean,A.std等

4.数组的索引

①传入一个值:a[x],如果a是一维的,那么就返回第x个值,如果a是个矩阵,那么久返回第x行(第x维),从0计数,x可以是负数。
②传入一个列表:a[[x,y]],相当于进行多次①中的操作,选取x和y
③传入一个坐标:a[x,y],返回矩阵中坐标为x,y的值

5.数组的切片

①要注意,数组与列表不同,数组切片操作得到的是指向相同内存空间的视图,而对列表操作得到的是原数组的副本。
②一维数组的切片方法类似列表,a[1:5],a[1:5:2],a[:5:],可传入三个数字,省去第一个默认为0,第二个数字默认为最后一个,第三个数字默认为1
③矩阵的切片:

A = np.ones((3, 4))

B = A[0:2, 0:3] # B.shape=(2,3)
C = A[:, 0] # C.shape=(3,),把第一列变成一维数组
D = A[0, :] # D.shape=(4,),截取第一行
E = A[[0, 2], 0:3] # E.shape=(2,3),索引值为列表时仅返回列表中的行/列

6.遍历数组

①for i in a: 遍历一维数组中每个元素或矩阵中每一行
②遍历矩阵中每一元素:用两次for或者for i in a.flat
③更优雅的遍历方法:numpy.apply_along_axis(func, axis, arr, *args, **kwargs)。func传入numpy函数或自定义的函数如np.mean,axis传入0或1表示对列或行进行迭代操作,arr传入需要遍历的数组。

A = np.array([[1,2,3], [4,5,6]])

b = np.apply_along_axis(np.mean, axis=0, arr=A)
#b = [2.5 3.5 4.5]

7.条件和布尔数组

输入a<0.5会返回一个与a大小相同的矩阵,即布尔数组,符合条件的元素值为true,不符合为false.
也可以将布尔数组应用于筛选元素,a[a<0.5],返回一个符合条件的元素组成的一维数组。

8.改变数组的形状

a = np.random.random(12)
A = a.reshape(3,4)    #不改变a的形状
a.shape = (4,3)       #改变a的形状
a.resize((2,6))       #改变a的形状
b = a.revel()         #返回a的一维数组的视图,不改变a的形状
c = a.flatten()       #返回a的一维数组的拷贝
d = a.transpose()     #返回a的转置矩阵,不改变a的形状

关于flatten()和ravel()的区别参考这篇博客:https://blog.csdn.net/lanchunhui/article/details/50354978

9.数组间的组合

a.shape = (3,3), b.shape=(3,3),  c.shape=(3,3)
d = np.hstack((a,b))           #将两个数组水平组合,c.shape = (3,6)
e = np.vstack((a,b))           #将两个数组垂直组合,e.shape = (6,3)
f = np.column_stack((a,b,c))   #将多个数组水平组合,f.shape = (3,9)
e = np.row_stack((a,b,c))      #将多个数组垂直组合,e.shape = (9,3)

10.数组间的切分

np.split(ary, indices_or_sections, axis=0):将数组从左到右或从上到下切分。ary传入要切分的数组,indices_or_sections传入整数或列表,如果是整数,就用该数平均切分,如果是列表,那么列表[x,y]中x,y分别是切分的位置(在x-1到x之间,y-1到y之间切分),axis传入0或1,0为按行切分,1为按列切分。

A.shape = (4,4)
[B,C] = np.split(A,2)                   #B.shape = C.shape = (2,4)
[A1,A2,A3] = np.split(A,[1,3],axis=1)   #A1.shape = A3.shape = (4,1) ; A2.shape = (4,2)

11.数组的副本

由于对数组切片返回的是原数组的视图而不是副本,因此想要得到副本需要使用 c=a.copy()

a = np.arange(1, 5)
b = a[0:3]
c = a.copy()

a[0] = 9
#a = [9, 2, 3, 4]
#b = [9, 2, 3]
#c = [1, 2, 3, 4]

12.数组的广播机制:

https://blog.csdn.net/lanchunhui/article/details/50158975

13.结构化数组:

https://blog.csdn.net/qq_27825451/article/details/82425512

扫描二维码关注公众号,回复: 5174141 查看本文章

14.数组数据文件的读写:

①保存为二进制的.npy文件:np.save(file,arr) file传入文件名或路径,不带.npy会自动补上,arr传入需要保存的数组
②读取.npy文件中的数据:loaded_data = np.load(file)
③读取TXT和CSV文件:https://www.cnblogs.com/laumians-notes/p/8288638.html

猜你喜欢

转载自blog.csdn.net/weixin_43756456/article/details/85779158