收录数据科学中主要使用的Numpy知识点,学Numpy这篇就够了

本文已参与「新人创作礼」活动,一起开启掘金创作之路

收录数据科学中主要使用的Numpy知识点,学Numpy这篇就够了

1 numpy数据类型

  • dtype
关键字 说明
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 多维数组展平

命令:

  • ravel()
  • flatten()

说明:

  • 不改变原数组
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() 和目标一样维度的零向量或矩阵
# 1.创建零行向量
x_v = np.zeros(5)
print(x_v)
>> [0. 0. 0. 0. 0.]

# 2.创建零矩阵
x_m = np.zeros([2,4])
print(x_m)
>> [[0. 0. 0. 0.]
 	[0. 0. 0. 0.]]

# 3.创建和目标一样shape的向量或矩阵
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

# 取一行,mat矩阵只要不取元素,结果都是矩阵,array取一行,得到的是行向量
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 矩阵求逆

  • .I 如果矩阵不可逆,会报异常
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]])

# sum相当于战平后再计算加和
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]])
# 1.阶乘prod,对于矩阵,相当于展平
print(np.prod(x_v))
>> 24
print(np.prod(x_m))
>> 2016
# 2.累阶乘cumprod
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')
# 1.写文件,savetxt
np.savetxt('matrix.csv',matrix)
# 2.读文件
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')

# 最大值,max
print(np.max(x_v))
print(np.max(x_m))
# 最小值,min
print(np.min(x_v))
print(np.min(x_m))
复制代码

4.4 取值范围 ptp

  • 最大值和最小值的差
x_v = np.array([1,2,3,4])

# 最大值与最小值的差,ptp
print(np.ptp(x_v))
>> 3
复制代码

4.5 中位数 median

# 中位数,median,np.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]])
# var是方差而不是伪方差
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]])

# 对于行向量,返回的是满足where条件的索引
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 三角函数

  • sin
  • cos
  • tan
x_m = np.random.rand(10)
# sin()
print(np.sin(x_m))
# cos()
print(np.cos(x_m))
# tan()
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

# 矩阵操作相当于展平jj
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

  • 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])
# 相关系数,corrcoef
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)
# polyfit,得到的是fit参数,相当于AX^2 + BX + C,第二个参数自由度,即用几次函数拟合样本输出
fit = np.polyfit(x,y,2)
# polyfit,预测,用已有的fit,来预测样本x的输出
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')
# 标记x轴和y轴
plt.xlabel('sample')
plt.ylabel('label')
# 画网格grid
plt.grid(True)
# 显示label
plt.legend(loc=0)
# 显示
plt.show()
复制代码

5.7 符号函数sign

  • <0 返回-1
  • >0 返回1
  • =0 返回0
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]
复制代码

猜你喜欢

转载自juejin.im/post/7077159809128071204
今日推荐