Numpy & Pandas
1 numpy
调入头文件
import numpy as np
1.1 numpy属性
#生成一个array数组
array = np.array([[1, 2, 3],
[2, 3, 4]])
#也可以这样 dtype表示array的元素类型
np.array([1, 2, 3], dtype = np.int64)
#array维度 2
array.dim
#array大小 (2, 3)
arrat.shape
#array元素数量 6
array.size
1.2 numpy的创建array
#3行4列全0元素
a = np.zeros((3, 4))
#全1元素
np.ones((3, 4))
#从a到b步长为c的数列 [a, b)
np.arange(a, b, c)
#生成一个三行四列的[0, 12)数列
a = np.arange(12).reshape((3, 4))
#生成从1到10.共五个数字(自动匹配步长)
a = np.linspace(1, 10, 5)
#arange(初始值,结束值,间隔) 生成的序列不包含结束值
#linspace(初始值, 结束值, 值的个数) 生成的序列包含结束值。
对于numpy中数组维度的问题:
该数组尺寸为(2,4,3),剥去最外层的中括号,得到的就是维度为0的两个尺寸为(4,3)的单位体,同理对第一个单位体再剥去一层中括号,得到的就是相应单位体中维度为1,尺寸为(3)的三个单位体(也可以看这篇文章)
1.3 numpy的基础运算
numpy中矩阵普通的预算都是对矩阵a和矩阵b中的元素逐个运算的
a = np.array([1, 2, 3])
b = np.array([2, 3, 4])
#对矩阵a和b进行逐个元素相加(加减乘除类似)
c = a+b #[3, 5, 7]
#对矩阵b的每个元素取平方
c = b**2
#对矩阵a和矩阵b进行矩阵相乘(要满足矩阵乘法要求)
c_dot = np.dot(a, b)
c_dot_2 = a.dot(b)
#对a不同维度元素取和(这里的取和即逐个元素加和)
c = np.sum(a, axis=0) #0维度逐个加和
1.4 numpy的索引
#如果想表示矩阵中特定的一个元素要写具体
A = np.arange(1, 13).reshape((3, 4))
#A[2]表示的是[9 10 11 12],即整个第二行
#A[2][0]或者A[2, 0]表示的是9
#另外,:可以表示所有元素
#A[2, :]表示[9 10 11 12]即第二行所有元素
#A[2, 1:3]表示[10 11],也是遵循[a,b)
对于二维矩阵A,A.T表示A的转置
for i in A:
print(i)
#结果是输出A的每一行,由此可知,i是表示的A[i]
#如果想要输出A中的每个元素呢?要用到flat或者flatten,如:
for i in A.flat:
print(i)
print(A.flatten('C'))
#注意这里的flat可以换成flatten,但是说法print(A.flatten)是错误的
flat和flatten的区别:
.flat作数组元素迭代器,可以用for访问数组每一个元素,A.flat返回的并不是一个列表或矩阵
.fatten(‘order’)则返回的是一份数组拷贝并改为一维的格式,且对拷贝所做的修改不会影响原始数组
其中参数order:‘C’:C-style,行序优先;‘F’:Fortran-style,列序优先;‘K’:按照元素在内存出现的顺序进行排序;
1.5 numpy的array合并
对于一个二维矩阵的合并来说,有分别从竖直方向和水平方向合并的两种方法:
A = np.array([1, 1, 1])
B = np.array([2, 2, 2])
C = np.vstack((A, B)) #vertical 在竖直方向上堆叠
D = np.hstack((A, B)) #horizontal 在水平方向上平铺
#两种合并都可以对多个矩阵进行合并,如(A, A, B, B)

对于非二维矩阵的合并呢?
首先看一下对于一个array怎么增加维度:
np.newaxis #用来给array增加维度 A的shape为(3,)
C = A[:, np.newaxis] #C的shape就变成了(3, 1)
D = A[np.newaxis, :] #D的shape就变成了(1, 3)
#所以可以得出一个结论,对于newaxis的使用,[:, np.newaxis, :]后得到的shape为(a, 1, b)
#其中a和b为原来张量的shape,newaxis表示在对应位置加一维且尺寸为1
然后先对array增加一维,合并:
#将A和B变为二维再去合并
A = np.array([1, 1, 1])[:, newaxis] #也可以这样写
B = np.array([2, 2, 2])[:, newaxis]
C = np.concatenate((A, B), axis=0)
D = np.concatenate((A, B), axis=1)


1.6 numpy的array拆分
A = np.arange(12).reshape((3, 4))
print(A)
#(array, 分成的份数, 对第几维分割)
print(np.split(A, 3, axis=0))
print(np.split(A, 4, axis=1))
输出结果为:
注意: 直接np.split的时候,array所分割的维度对应的尺寸可以被分成的份数整除,不然会报错
对于无法整除的情况呢?
print(np.array_split(A, 3, axis=1))
结果为:
很明显,原数组被分成了(2,1,1)的形式(没有等分)
1.7 numpy的copy & deep copy
在python中,浅拷贝相当于c中的指针指向同一个位置,引用的同一个数据,而深拷贝才是真正的拷贝
A = np.array([1, 2, 3])
B = A
C = A.copy()
A[0] = 2
print(B) #[2 2 3]
print(C) #[1 2 3]