科学运算当中最为重要的两个模块,一个是 numpy,一个是 pandas
Numpy 属性
使用 Numpy
1 | import numpy as np |
列表转化为矩阵 :
1 | a1 = np.array([[1,2,3],[2,3,4]]) |
关键字:
array:创建数组
dtype:指定数据类型
zeros:创建数据全为0
ones:创建数据全为1
empty:创建数据接近0
arrange:按指定范围创建数据
linspace:创建线段
Numpy 的创建 array
一维 array ,用 list 的形式创建,指定数据 dtype
1 | a = np.array([2,23,4],dtype=np.float) |
arange
创建连续数组(用法和 python 中 range 函数 相似) , 使用 reshape
改变数据的形状 (可以把一维 array 转化为 矩阵), 用 linspace
创建线段型数据:
1 | a = np.arange(10,22,2).reshape((2,3)) # 3行4列 从[10,22),步长为2 |
矩阵
二维 array ,矩阵,外部需要一个 []。
1 | a = np.array([[2,23,4],[2,32,4]]) # 2d 矩阵 2行3列 |
Numpy 基础运算
一维矩阵
加减乘除,乘方依赖 **
1 | a = np.array([10,20,30,40]) |
Numpy中具有很多的数学函数工具
print
函数进行逻辑判断
1 | print(b<3) |
多行多维度的矩阵
矩阵的乘法
1 | c_dot = np.dot(a,b) |
查找运算
矩阵元素的 sum(), min(), max()
行或者列进行查找运算:当axis的值为0的时候,将会以列作为查找单元, 当axis的值为1的时候,将会以行作为查找单元
元素的索引
argmin()
:求矩阵中最小元素的索引argmax()
:求矩阵中最大元素的索引
基本运算
均值:
np.mean(A) 、np.average(A) 、A.mean()
中位数:
A.median()
累加函数,类似 matlab 中的
cumsum()
1 | A = np.arange(2,14).reshape((3,4)) |
- 累差运算函数:diff
nonzero()
函数:这个函数将所有非零元素的行与列坐标分割开,重构成两个分别关于行和列的矩阵。
1 | print(np.nonzero(A)) |
- 排序函数(仅针对每行排序):sort(A)
- 矩阵的转置:
1 | print(np.transpose(A)) |
- clip()函数
这个函数的格式是clip(Array,Array_min,Array_max)
,也就是格式化矩阵,规则是比 Array_min 小的元素都成为 Array_min,比 Array_max 大的元素都等于 Array_max 。
Numpy 索引
一维索引
类似index,在二维矩阵中A[2]
表示第三行一整行的元素。
二维索引
二维索引可以表示矩阵中具体的单个元素:
1 | A = np.arange(3,15).reshape((3,4)) |
在Python的 list 中,我们可以利用对一定范围内的元素进行切片操作,在 numpy 中也可以这样操作。
迭代输出
flatten 函数:将多维矩阵展开成一行的数列,flat
是一个迭代器,本身是一个object
属性。
1 | for row in A: |
array 合并
np.vstack() :上下合并
np.hstack() :左右合并
np.newaxis():当一个序列需要矩阵转置的效果,
1 | A = np.array([1,1,1]) |
np.concatenate() :合并多个矩阵或序列,axis
参数很好的控制了矩阵的纵向或是横向打印
1 | np.concatenate((A,B,B,A),axis=0) #左右合并 |
array 分割
纵向分割 ;横向分割; split 的参数,第一个参数是需要操作的 array,第二个参数是平均分为几个数组(对等分割),若参数不对ValueError: array split does not result in an equal division
,第三个参数来决定是纵向分割还是横向分割。
1 | A = np.arange(12).reshape((3, 4)) |
不等量的分割 :np.array_split()
其他的分割方式:np.vsplit() 与 np.hsplit()
1 | np.vsplit(A, 3) #等于 np.split(A, 3, axis=0) 上下合并 |
Python中numpy数组切片
一维数组(冒号:)
二维数组(逗号,)
Numpy copy & deep copy
= 的赋值方式会带有关联性
b = a,c = a,d = b,改变a
的第一个值,b
、c
、d
的第一个值也会同时改变,同样更改d
的值,a
、b
、c
也会改变。类似指针赋值。
copy() 的赋值方式没有关联性
b = a.copy() 改变 a 的值,b 不会改变
np.nan
nan(NAN,Nan):not a number表示不是一个数字,往往 np.nan 是作为缺省值出现的
常用方法
生成数组/数字
- numpy.random.seed() :重现随机数,只要 seed 里面参数相同,随机数就是一样的
- numpy.zeros(shape,dtype=float,order = ‘C’):创建所有元素都为 0 的list
- shape:int 或 int 的元组,int 是 list 的个数,int 的元组是创建一个二维 list
- order :’C’,’F’},可选,默认:’C’。是否在内容中以行(C)或列(F)顺序存储多维数据。
1 | data = np.zeros(5, dtype=int) |
numpy.random.uniform(low,high,size) :从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开,即包含low,不包含high.
- low: 采样下界,float类型,默认值为0;
- high: 采样上界,float类型,默认值为1;
- size: 输出样本数目,为int或元组(tuple)类型,例如,size=(m,n,k), 则输出mnk个样本,缺省时输出1个值
- 返回值:ndarray类型,其形状和参数size中描述一致。
np.random.normal(size,loc,scale): 给出均值为loc,标准差为scale的高斯随机数(场)
- np.random.randn(size) 所谓标准正态分布,对应于
np.random.normal(loc=0, scale=1, size)
。
- np.random.randn(size) 所谓标准正态分布,对应于
numpy.random.choice() 函数:从给定的1维数组中随机采样的函数。
- numpy.random.choice(a, size=None, replace=True, p=None)
1 | # 参数意思分别 是从a ( [0,5) )中以概率P,随机选择3个, p没有指定的时候相当于是一致的分布 |
- numpy.linspace():在指定的间隔内返回均匀间隔的数字。numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
数组索引
argsort()函数是将x中的元素从小到大排列,提取其对应的index(索引号)
1 | One dimensional array:一维数组 |
其他
argmax() / idxmax() 方法 :用于获取 Series 的最大值的索引值,也就是最大数据的索引值。
np.newaxis 为 numpy.ndarray(多维数组)增加一个轴
x[np.newaxis, :] :把 x 所有元素套在一个数组里面,变成一个元素
x[:, np.newaxis] :把 x 所有元素套在一个数组里面,同时变成列向量
x = np.random.randint(1, 8, size=5) array([4, 6, 6, 6, 5])
x1 = x[np.newaxis, :]
Out[50]:
array([[4, 6, 6, 6, 5]])
x2 = x[:, np.newaxis]
x2
Out[52]:
array([[4],
[6],
[6],
[6],
[5]])
1
2
+ 用法 :索引多维数组的某一列时返回的是一个行向量
>>> X = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
>>> X[:, 1]
array([2, 6, 10])
# 还是一个列向量
>>>X[:, 1][:, np.newaxis]
array([[2],
[6],
[10]])
```