前言
NumPy 是一个 Python 包。 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库,主要用来处理数组和矩阵。NumPy调用了大量的用C语言编写的算法库,使得其可以直接操作内存,不必进行Python动态语言特性所含有的前期类型检查工作,从而大大提高了运算速度。
这篇文章介绍了numpy最常用的一些用法,敲一遍下面的代码就算入门了。
导入
impotrt numpy as np
向量矩阵
vector = np.array([5, 10, 15, 20]) # 一维向量
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 矩阵
print(matrix)
[[1 2 3]
[4 5 6]
[7 8 9]]
print(matrix.ndim) # 维度
2
print(matrix.shape) # 形状
(3, 3)
print(matrix.size) # 有多少元素
9
print(matrix.dtype) # 向量中的数据类型
int32
切片
vector = np.array([5, 10, 15, 20]) # 一维向量
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 矩阵
print(matrix[0,0]) # >> 5
print(vector[0:3]) # >> [5 10 15] 0~3表示0 1 2
print(matrix[:,1]) # >> [3 5 8] 此处冒号代表所有行
print(matrix[:,0:2]) # >> [[1 2], [4 5], [7 8]]
判断操作
vector = np.array([5, 10, 15, 20]) # 一维向量
print(vector == 10)
([False, True, False, False])
数据类型转换
vector = np.array([1, 2, 3]) # 数据类型是
print(vector.dtype)
int32
vector = vector.astype(float) # 类型转换
print(vector.dtype)
float64
最值
vector.min() # 最大值
vector.max() # 最小值
对整行、列操作
matrix.sum(axis = 1) # 对行求和
matrix.sum(axis = 0) # 对列求和
range
range(stop) #或下面的
range(start, stop[, step]) #返回list对象,只能有整数
range(0, 5) 即从0到5,但不包括5,即0 1 2 3 4
range(0, 10, 2) 即从0到10,但不包括10,步幅为2,
输出为:1, 3, 5, 7, 9
arange
arange([start,] stop[, step,], dtype=None)
#返回ndarray对象,numpy中的函数,与range相比,可以有浮点数
np.arange(10, 30, 5) # >> array([10, 15, 20 25]) 从10到30 间隔5 注意 30取不到
np.arange(15) # >> [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
data = np.arange(20).reshape(5,4)
print(data)
# 会输出:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
[16 17 18 19]]
range(data.shape[0]) # >> range(0, 5) 即从0到5,但不包括5,即0 1 2 3 4
range(data.shape[1]) # >> range(0,4)即从0到4,但不包括4,即 0 1 2 3
reshape
a = np.arange(15).reshape(3, 5) # array([0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14])
a.reshape(3,-1) # 确定了3行,-1是让电脑自己算有几列
初始化矩阵
np.zeros((3,4)) # 3行4列的元素全为0的矩阵+
np.ones((5,6)) # 5行6列的元素全为1的矩阵
np.ones((2,3,4), dtype=np.int32) # 默认是float类型,现在将类型换为整数
np.random.random((2,3)) # 一个矩阵,元素是从-1到+1之间的随机值
矩阵乘法
dot
①一维,计算内积,得到一个值
②多维,满足矩阵相乘
import numpy as np
A.dot(B) # 正常矩阵相乘
np.dot(A,B) # 同上
outer
①对于多维向量,全部展开变为一维向量
②第一个参数表示倍数,使得第二个向量每次变为几倍。
③第一个参数确定结果的行,第二个参数确定结果的列
import numpy as np
x1 = [1,2,3]
x2 = [4,5,6]
outer = np.outer(x1,x2)
print outer
[[ 4 5 6] #1倍
[ 8 10 12] #2倍
[12 15 18]] #3倍
x1 = [[1,2],[3,4]]
x2 = [[1,1],[1,1]]
outer = np.outer(x1,x2)
print outer
[[1 1 1 1] #1倍
[2 2 2 2] #2倍
[3 3 3 3] #3倍
[4 4 4 4]] #4倍
multiply和*
①对应位置相乘
②两个参数和结果的shape应该一致
import numpy as np
A*B # 点乘(对应元素相乘)
np.multiply(A, B) # 同上
矩阵拼接、分割
np.hstack((a,b)) # 矩阵a和b横着拼
np.vstack((a,b)) # 矩阵a和b纵着拼
np.hsplit(a,3) # 矩阵a平均切分为3份
np.hsplit(a,(3,4)) # 矩阵a 从3处切一下,从4处切一下
np.split(GG,2,axis=1)
np.split(GG,3,axis=0)
# 若不能均分为3份,上面两个语句会出错,用下面这个就ok了
print(np.array_split(A,3,axis=1))
复制
a = np.arange(12)
b = a # a和b是一个位置的不同名字,改变b, a也就跟着变了
b.shape = 3,4 # a.shape也就变成了 3,4
c = a.view() # c和a指向不同位置,但是共用同一套值
d = a.copy() # d和a互不影响
np.grgmax
ind = data.argmax(axis=0) # 每一列中最大元素的索引值
data_max = data[ind, range(data.shape[1])] # 找出每一列的最大值
ind1 = data.grgmax(axis=1) # 每一行中最大元素的索引值
# data[行号,列号] ,现在是找每行的最大值,ind里是每行的最大值的位置,即列号
data_max = data[range(data.shape[0]),ind] # 找出每一行的最大值
np.tile
a = np.array([[3,1],[2,1]])
b = np.tile(a, (2,3)) # 将a的行的元素个数扩大两倍,列的元素个数扩大3倍
print(a)
print(b)
[[3 1]
[2 1]]
[[3 1 3 1 3 1]
[2 1 2 1 2 1]
[3 1 3 1 3 1]
[2 1 2 1 2 1]]
np.linspace
b = np.linspace(1, 10, 5) # 线段 起始、结束、几段
print(b)
[ 1. 3.25 5.5 7.75 10. ]
排序
a.sort() # a中元素从小到大排序
a.sort(reverse=True) # 从大到小排序
j = a.argsort(a) # a中元素从小到大排序的序列号
k = a[]
a[j] # 可以得到排序后的结果
其它
A = np.arange(2,14).reshape([3,4])
print(A)
[[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]]
print(np.argmax(A)) # 最大值索引
11
print(np.mean(A)) # 平均值
7.5
print(np.average(A)) # 平均值
7.5
print(np.median(A)) # 中位数
7.5
print(np.cumsum(A)) # 每个元素是之前所有元素相加的和
[ 2 5 9 14 20 27 35 44 54 65 77 90]
print(np.diff(A)) # 相邻两个元素之间的差
[[1 1 1]
[1 1 1]
[1 1 1]]
print(np.clip(A,5,9)) # 小于5变为5,大于9变为9
[[5 5 5 5]
[6 7 8 9]
[9 9 9 9]]