本文已参与「新人创作礼」活动,一起开启掘金创作之路
收录数据科学中主要使用的Numpy知识点,学Numpy这篇就够了
1 numpy数据类型
关键字 |
说明 |
inti |
int32或int64,由所在平台决定精度的整数 |
int8 int16 int32 int64 |
有符号整数 |
uint8 uint16 uint32 uint64 |
无符号整数 |
float16 float32 float64 |
复数 |
complex64 complex128 |
复数 |
2 numpy数组
2.1 创建数组
2.1.1 创建一维数组 arange
- 格式:np.arange(start,end,step,dtype)
np.arange(10)
>> [0 1 2 3 4 5 6 7 8 9]
np.arange(2,10)
>> [2 3 4 5 6 7 8 9]
np.arange(2,10,3)
>> [2 5 8]
np.arange(2,10,3,dtype='float64')
>> [2. 5. 8.]
复制代码
2.1.2 创建多维数组 array
np.array([1,5])
>> [1 5]
np.array([[1,5],[6,10]])
>> [[ 1 5]
[ 6 10]]
复制代码
2.2 改变数组维度
命令 |
说明 |
reshape() |
不在原数组上修改,返回改变后的结果 |
shape |
得到或者设置维度(修改原数组) |
resize() |
原数组上修改 |
2.2.1 reshape()
a = np.arange(12)
b = a.reshape(3,4)
print(a)
print(b)
>> [ 0 1 2 3 4 5 6 7 8 9 10 11]
>> [[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
复制代码
2.2.2 shape
a = np.arange(12)
a_shape = a.shape
print(a_shape)
>> (12,)
a.shape = (3,4)
print(a)
>> [[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
复制代码
2.2.3 resize()
a = np.arange(12)
b = a.resize(3,4)
print(b)
>> None
print(a)
>> [[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
复制代码
2.3 多维数组展平
命令:
说明:
a = np.array([[1,2],[3,4]])
a_ravel = a.ravel()
a_flatten = a.flatten()
print(a_ravel)
>> [1 2 3 4]
print(a_flatten)
>> [1 2 3 4]
复制代码
2.4 切片
a = np.array([[1,2],[3,4]])
print(a)
>> [[1 2]
[3 4]]
print(a[0,0])
>> 1
>
print(a[:,0])
>> [1 3]
复制代码
其中":"表示任意,a[:,0]表示任意行的索引0列
2.5 数组组合
2.5.1 水平组合hstack
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
print(np.hstack((a,b)))
>> [[1 2 5 6]
[3 4 7 8]]
复制代码
2.5.2 垂直组合vstack
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
print(np.vstack((a,b)))
>> [[1 2]
[3 4]
[5 6]
[7 8]]
复制代码
2.5.3 数组组合dstack
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
print(np.dstack((a,b)))
>> [[[1 5]
[2 6]]
[[3 7]
[4 8]]]
复制代码
2.5.4 列组合column_stack
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
print(np.column_stack((a,b)))
>> [[1 2 5 6]
[3 4 7 8]]
复制代码
2.5.5 行组合row_stack
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
print(np.row_stack((a,b)))
>> [[1 2]
[3 4]
[5 6]
[7 8]]
复制代码
2.6 数组分割
a = np.array([[1,2],[3,4]])
print(a[0,0])
>> 1
print(a[:,0])
>> [1 3]
复制代码
2.7 numpy数组与python列表转换
命令 |
说明 |
tolist() |
转成数组 |
astype(类型) |
指定转换数组的类型 |
a = np.arange(5)
print(a.tolist())
>> [0, 1, 2, 3, 4]
print(a.astype(float))
>> [0. 1. 2. 3. 4.]
复制代码
2.8 其他常用命令
功能 |
命令 |
获取数据类型 |
dtype |
占用内存的字节数 |
itemsize |
数组的维度或者数组轴的个数 |
ndim |
real |
返回复数的实部 |
imag |
返回复数的虚部 |
flat |
返回扁平迭代器 |
3 矩阵
3.1 创建单位矩阵 eye
eye = np.eye(3)
print(eye)
>> [[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
复制代码
3.2 零向量和零矩阵
命令 |
说明 |
zero() |
创建零向量或矩阵 |
zero_like() |
和目标一样维度的零向量或矩阵 |
x_v = np.zeros(5)
print(x_v)
>> [0. 0. 0. 0. 0.]
x_m = np.zeros([2,4])
print(x_m)
>> [[0. 0. 0. 0.]
[0. 0. 0. 0.]]
x_v = np.array([1,2,3,4])
x_m = np.array([[1,2,3],[4,5,6]])
print(np.zeros_like(x_v))
>> [0 0 0 0]
print(np.zeros_like(x_m))
>> [[0 0 0]
[0 0 0]]
复制代码
3.3 one向量或矩阵
命令 |
说明 |
ones() |
创建值为1的向量或矩阵 |
ones_like() |
创建和目标一样维度的值为1的向量或矩阵 |
print(np.ones(5))
>> [1. 1. 1. 1. 1.]
print(np.ones([2,3]))
>> [[1. 1. 1.]
[1. 1. 1.]]
x_m = np.array([[1,2,3],[4,5,6]])
print(np.ones_like(x_m))
>> [[1 1 1]
[1 1 1]]
复制代码
3.4 mat矩阵和array矩阵的取值
- mat取值:[m,n]
- array取值:[m][n]
x_v_m = np.mat('1 2 3;4 5 6')
x_v_a = np.array([[1,2,3],[4,5,6]])
print(x_v_m[1,2])
>> 6
print(x_v_a[1][2])
>> 6
print(x_v_m[0,:])
>> [[1 2 3]]
print(x_v_a[0])
>> [1 2 3]
print(x_v_m[:,0])
>> [[1]
[4]]
复制代码
3.5 mat矩阵和array矩阵的转换
- .A 把mat转成array
- np.mat() 把mat转成array
x_m = np.mat('1 2 3; 4 5 6')
x_a = x_m.A
print(type(x_a))
>> <class 'numpy.ndarray'>
>
x_m = np.mat(x_a)
print(type(x_m))
>> <class 'numpy.matrix'>
复制代码
3.6 转置矩阵T
x_m = np.mat('1 2 3; 4 5 6')
print(x_m)
>> [[1 2 3]
[4 5 6]]
print(x_m.T)
>> [[1 4]
[2 5]
[3 6]]
复制代码
3.7 矩阵求逆
x_m = np.mat('1 2 3; 4 5 6 ; 0 0 1')
print(x_m.I)
>> [[-1.66666667 0.66666667 1. ]
[ 1.33333333 -0.33333333 -2. ]
[ 0. 0. 1. ]]
复制代码
3.8 合并块矩阵 bmat
x_m = np.mat('1 2;3 4')
print(np.bmat('x_m x_m'))
>> [[1 2 1 2]
[3 4 3 4]]
print(np.bmat('x_m;x_m'))
>> [[1 2]
[3 4]
[1 2]
[3 4]]
复制代码
3.9 加减除
3.9.1 常数运算
a = np.mat('1 2 ; 3 4')
print(a + 2)
print(a - 2)
print(a / 2)
复制代码
3.9.2 矩阵相加减
a = np.mat('1 2 ; 3 4')
b = np.mat('5 6 ; 7 8')
print(a + b)
>> [[ 6 8]
[10 12]]
print(a - b)
>> [[-4 -4]
[-4 -4]]
复制代码
3.9.3 除法 divide
命令 |
说明 |
/和divide |
普通除法 |
//和floor_divide |
保留整数部分 |
x_v1 = np.array([1,2,3])
x_v2 = np.array([3,5,6])
print(np.divide(x_v1,x_v2))
>> [0.33333333 0.4 0.5 ]
print(np.floor_divide(x_v1,x_v2))
>> [0 0 0]
复制代码
3.9.4 add、multiply、subtract
命令 |
说明 |
add |
加法 |
multiply |
乘法 |
subtract |
减法 |
- reduce 直接返回结果
- accumulate 保留中间过程
以加法为例:
- 如果是行向量,返回加和
- 如果是矩阵,按列为单位加和,得到1*n的行向量
x_v = np.array([1,2,3])
x_m = np.mat('1 2 3;4 5 6;7 8 9')
print(np.add.reduce(x_v))
>> 6
print(np.add.reduce(x_m))
>> [[12 15 18]]
print(np.add.accumulate(x_v))
>> [1 3 6]
print(np.add.accumulate(x_m))
>> [[ 1 2 3]
[ 5 7 9]
[12 15 18]]
复制代码
3.9.5 展平求和 sum
x_v = np.array([1,2,3,4])
x_m = np.array([[1,2,3],[4,5,6]])
print(np.sum(x_v))
>> 10
print(np.sum(x_m))
>> 21
复制代码
3.10 乘法
3.10.1 常数相乘
a = np.mat('1 2 ; 3 4')
print(a * 2)
>> [[2 4]
[6 8]]
复制代码
3.10.2 矩阵相乘
类型 |
* |
array |
对应元素相乘 |
mat |
矩阵相乘 |
命令 |
说明 |
np.dot() |
矩阵相乘 |
np.multiply() |
对应元素相乘 |
x_array_m = np.array([[1,2,3],[4,5,6]])
print(x_array_m * x_array_m)
>> [[ 1 4 9]
[16 25 36]]
复制代码
x_mat_m = np.mat('1 2 3; 4 5 6')
print(x_mat_m * x_mat_m.T)
>> [[14 32]
[32 77]]
复制代码
3.10.3 向量相乘
类型 |
* |
dot |
multiply |
array |
对应元素相乘 |
内积 |
对应元素相乘 |
x_v = np.array([1,2,3,4])
print(x_v * x_v)
>> [ 1 4 9 16]
print(np.dot(x_v,x_v))
>> 30
print(np.multiply(x_v,x_v))
>> [ 1 4 9 16]
复制代码
3.10.4 阶乘
命令 |
说明 |
prod |
直接返回最大值 |
comprod |
展平后计算阶乘 |
x_v = np.array([1,2,3,4])
x_m = np.array([[1,2,3],[6,7,8]])
print(np.prod(x_v))
>> 24
print(np.prod(x_m))
>> 2016
print(np.cumprod(x_v))
>> [ 1 2 6 24]
print(np.cumprod(x_m))
>> [ 1 2 6 36 252 2016]
复制代码
4 常用函数
4.1 读写文件
- 写文件:savetxt
- 读文件:loadtxt
- delimiter:列的分隔符,默认是空格
- usecols:载入哪列,默认所有(元组的方式表示)
- unpack:是否转置,默认是否
matrix = np.mat('1 2 3 ; 4 5 6; 7 8 9')
np.savetxt('matrix.csv',matrix)
content = np.loadtxt('matrix.csv',delimiter=' ',usecols=(0,1,2),unpack=True)
print(content)
复制代码
4.2 算数平均值 mean
x_v = np.array([1,2,3,4])
x_m = np.mat('1 2 3; 4 5 6')
print(np.mean(x_v))
>> 2.5
print(np.mean(x_m))
>> 3.5
复制代码
4.3 最大值 最小值 max min
x_v = np.array([1,2,3,4])
x_m = np.mat('1 2 3; 4 5 6')
print(np.max(x_v))
print(np.max(x_m))
print(np.min(x_v))
print(np.min(x_m))
复制代码
4.4 取值范围 ptp
x_v = np.array([1,2,3,4])
print(np.ptp(x_v))
>> 3
复制代码
4.5 中位数 median
x_v = np.array([1,2,3,4])
print(np.median(x_v))
>> 2.5
复制代码
4.6 排序 msort
x_v = np.array([1,2,5,1,2,6,2])
print(np.msort(x_v))
>> [1 1 2 2 2 5 6]
复制代码
4.7 方差 var
x_v = np.array([1,2,3,4])
x_m = np.array([[1,2,3],[4,5,6]])
print(np.var(x_v))
>> 1.25
print(np.var(x_m))
>> 2.9166666666666665
复制代码
4.8 标准差 std
x_v = np.array([1,2,3,4])
x_m = np.array([[1,2,3],[4,5,6]])
print(np.std(x_v))
>> 1.118033988749895
print(np.std(x_m)
>> 1.707825127659933
复制代码
4.9 相邻元素差 diff
x_v = np.array([1,2,3,4])
x_m = np.array([[1,2,3],[4,5,6]])
print(np.diff(x_v))
>> [1 1 1]
print(np.diff(x_m))
>> [[1 1]
[1 1]]
复制代码
4.10 算数平方根 sqrt
x_v = np.array([1,2,3,4])
x_m = np.array([[1,2,3],[4,5,6]])
print(np.sqrt(x_v))
>> [1. 1.41421356 1.73205081 2. ]
print(np.sqrt(x_m))
>> [[1. 1.41421356 1.73205081]
[2. 2.23606798 2.44948974]]
复制代码
4.11 满足条件索引 where
- 对于行向量,返回的是满足where条件的索引
- 对于矩阵,第一个是行的索引,第二个是列的索引
x_v = np.array([1,2,3,4])
x_m = np.array([[1,2,3],[4,5,6]])
print(np.where(x_v > 2))
>> (array([2, 3], dtype=int64),)
print(np.where(x_m > 2))
>> (array([0, 1, 1, 1], dtype=int64), array([2, 0, 1, 2], dtype=int64))
ret = np.where(x_m > 2)
for i in range(len(ret[0])):
row_index = ret[0][i]
column_index = ret[1][i]
print(x_m[row_index][column_index])
>> 3
4
5
6
复制代码
4.12 根据索引获得元素 take
- 向量,根据索引返回
- 矩阵,相当于把矩阵展平,然后根据索引返回
x_v = np.array([1,2,3,4])
x_m = np.array([[1,2,3],[4,5,6]])
print(np.take(x_v,[0,1,2]))
>> [1 2 3]
print(np.take(x_m,[4,5]))
>> [5 6]
复制代码
4.13 最值比较
- maximum 比较两个对象的最大值谁大,返回最大的那个对象
- minimum 比较两个对象的最小值谁小,返回最小的那个对象
x_v1 = np.array([0,2,3,4])
x_v2 = np.array([1,1,1,5])
print(np.maximum(x_v1,x_v2))
>> [1 2 3 5]
print(np.minimum(x_v1,x_v2))
>> [0 1 1 4]
复制代码
4.14 e的指数 exp
x_v = np.array([1,2,3,4])
x_m = np.array([[1,2,3],[4,5,6]])
print(np.exp(x_v))
>> [ 2.71828183 7.3890561 20.08553692 54.59815003]
print(np.exp(x_m))
>> [[ 2.71828183 7.3890561 20.08553692]
[ 54.59815003 148.4131591 403.42879349]]
复制代码
4.15 linespace
linspace(start,end,num)
- start 起始
- end 终止,包括end
- num 点的格式,相当于1/step
x_v1 = np.linspace(0,10,10)
print(x_v1)
>> [ 0. 1.11111111 2.22222222 3.33333333 4.44444444 5.55555556
6.66666667 7.77777778 8.88888889 10. ]
复制代码
4.16 界定便捷 clip
- 大于边界 取边界最大值
- 小于边界 取边界最小值
- 属于边界范围内,原数值输出
x_v = np.array([1,2,3,4])
print(x_v)
print(np.clip(x_v,2,3))
>> [1 2 3 4]
[2 2 3 3]
x_m = np.array([[1,2,3],[4,5,6]])
print(x_m)
print(np.clip(x_m,2,4))
>> [[1 2 3]
[4 5 6]]
>> [[2 2 3]
[4 4 4]]
复制代码
4.17 满足条件的元素 compress
- 只能基于向量操作,返回的是满足条件的元素,而不是索引
x_v = np.array([1,2,3,4])
print(x_v.compress(x_v > 2))
>> [3 4]
复制代码
4.18 三角函数
x_m = np.random.rand(10)
print(np.sin(x_m))
print(np.cos(x_m))
print(np.tan(x_m))
复制代码
4.19 最值索引
- argmax和argmin,返回最大|小值索引(矩阵相当于展平)
x_v = np.array([1,2,3,4])
print(np.argmax(x_v))
>> 3
print(np.argmin(x_v))
>> 0
x_m = np.array([[1,2,3],[4,5,6]])
print(np.argmax(x_m))
>> 5
print(np.argmin(x_m))
>> 0
复制代码
5 便携函数
5.1 协方差 cov
x_v1 = np.array([1,2,3,4])
x_v2 = np.array([4,5,6,7])
print(np.cov(x_v1,x_v2))
>> [[1.66666667 1.66666667]
[1.66666667 1.66666667]]
复制代码
5.2 对角线元素diagonal
x_m = np.array([[1,2,3,4],[2,3,4,5]])
print(x_m)
>> [[1 2 3 4]
[2 3 4 5]]
print(np.diagonal(x_m))
>> [1 3]
复制代码
5.3 矩阵的迹 trace
x_m = np.array([[1,2,3,4],[2,3,4,5]])
print(x_m)
>> [[1 2 3 4]
[2 3 4 5]]
print(np.trace(x_m))
>> 4
复制代码
5.4 相关系数 corrcoef
x_v1 = np.array([1,2,3,4])
x_v2 = np.array([2,3,4,5])
print(np.corrcoef(x_v1,x_v2))
>> [[1. 1.]
[1. 1.]]
复制代码
5.5 绝对值abs
x_m = np.array([[-1,-2,-3],[1,2,3]])
print(np.abs(x_m))
>> [[1 2 3]
[1 2 3]]
复制代码
5.6 多项式拟合
import numpy as np
x = np.random.rand(50) * 50
y = -(np.sin(x)*2 + 0.5 * x ** 2)
fit = np.polyfit(x,y,2)
fit_y = np.polyval(fit,x)
from matplotlib import pyplot as plt
plt.plot(x,y,'b^',label='sample')
plt.plot(x,fit_y,'r.',label='predict')
print(np.roots(fit))
fit_der = np.polyder(fit)
print('原来的系数',fit)
print('求导后的系数',fit_der)
x_line = np.linspace(np.min(x),np.max(x),100)
y_line = np.polyval(fit,x_line)
plt.plot(x_line,y_line,color='y')
y_line_fit_der = np.polyval(fit_der,x_line)
plt.plot(x_line,y_line_fit_der,color='b')
plt.xlabel('sample')
plt.ylabel('label')
plt.grid(True)
plt.legend(loc=0)
plt.show()
复制代码
5.7 符号函数sign
x_v = np.array([[1,2,3]]) - 2
x_m = np.array([[1,2,3],[4,5,6]]) - 2
print(np.sign(x_v))
>> [[-1 0 1]]
print(np.sign(x_m))
>> [[-1 0 1]
[ 1 1 1]]
复制代码
5.8 去噪piecewise
- 第一个参数:要修改的对象
- 第二个参数:列表内写条件
- 第三个参数:对应每个条件满足后,元素被赋什么值
x_v = np.array([1,2,3,4]) - 1
x_m = np.array([[1,2,3],[4,5,6]])
print(x_v)
print(np.piecewise(x_v,[x_v < 1,x_v > 2],[-100,100]))
>> [0 1 2 3 ]
>> [-100 0 0 100 ]
print(x_m)
print(np.piecewise(x_m,[x_m < 3,x_m > 5],[-100,100]))
>> [[ 1 2 3]
[ 4 5 6]]
>> [[-100 -100 0]
[ 0 0 100]]
复制代码
5.9 判断是否是实数 isreal
x_v = np.array([1+2j])
print(np.isreal(x_v))
>> [False]
复制代码