Numpy介绍
Numpy是一个用python实现的科学计算的扩展程序库,它支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。以下是numpy的一些操作
1.Numpy一些基本小操作
'''
例1:向列表转矩阵,输出矩阵的维度,行列数,矩阵中的元素个数
'''
import numpy as np
#列表转矩阵
array = np.array([
[1,2,3],
[4,5,6]
])
print(array) #打印矩阵
print('dim = %d' % array.ndim) # 输出矩阵的维度
print('shape =',array.shape) # 输出矩阵的行数和列数
print('size = %d' % array.size) #输出元素的个数
'''
结果:
[[1 2 3]
[4 5 6]]
dim = 2
shape = (2, 3)
size = 6
'''
2.Numpy创建数组
'''
例2:创建一维、多维数组、创建全0数组、创建全1数组、创建空数组
创建连续型数组、改变数组形状、创建线段数据
'''
import numpy as np
#创建一维数组
a = np.array([2,3,4], dtype=np.int32) #默认类型为int32
print(a)
print(a.dtype) # 输出元素类型
#创建多维数组
b = np.array([
[1,2,3],
[4,5,6]
])
print(b)
#创建全0数组
c = np.zeros((2,3)) # 生成2×3矩阵(2行3列)
print(c)
#创建全1数组,指定元素类型
d = np.ones((3,4),dtype=np.int) #创建3×4的全1数组
print(d)
#创建全空数组,其实每个元素的值都是接近0的数
e = np.empty((2,3)) #创建2×3的空矩阵
print(e)
'''
e:
[[2.12199579e-314 2.12199579e-314 2.12199579e-314]
[2.12199579e-314 2.12199579e-314 2.12199579e-314]]
'''
#创建连续型数组
f = np.arange(2,21,2) # 2-20数据,步长为2
print(f)
'''
f:
[ 2 4 6 8 10 12 14 16 18 20]
'''
#reshape函数改变上面数据的形状
g = f.reshape(2,5) #由 1×10 变为 2×5
print(g)
'''
g:
[[ 2 4 6 8 10]
[12 14 16 18 20]]
'''
#创建线段型数据
h = np.linspace(0,10,6) #开始端0, 结束端10,分割成5个数据,
# 最后一个参数为数字的个数,线段数要减1
print(h)
'''
h:
[ 0. 2. 4. 6. 8. 10.]
'''
#也可以进行reshape操作
i = h.reshape((2,3))
print(i)
'''
i:
[[ 0. 2. 4.]
[ 6. 8. 10.]]
'''
3.Numpy的基本运算
'''
例3:一维矩阵运算:矩阵加减法,每个元素相乘、平方、三角函数、条件判断
'''
import numpy as np
a = np.array([10,20,30,40])
b = np.arange(4)
print(a,b)
# 矩阵加减法
c = a + b
d = a - b
print(c,d)
# 每个元素于每个元素相乘
print(a*b)
#求矩阵中每个元素的平方
c = b**2
print(c)
# np中的三角函数,计算每个元素的sin值
c = np.sin(a)
print(c)
#判断每个元素大小
print(b<2)
#判断每个元素是否相等
a = np.array([1,2,3,4])
b = np.arange(4)
print(a == b)
'''
例4:多维矩阵运算:矩阵乘法,生成随机矩阵,行操作列操作,矩阵元素求和、求最大、求最小值
'''
import numpy as np
a = np.array([[1,1],[1,2]])
b = np.arange(4).reshape(2,2)
print(a)
print(b)
#多维矩阵乘法
c = a.dot(b)
d = np.dot(a,b) #注意多维矩阵乘法不能用*号
print(c)
print(d)
n = np.random.random((2,2))#生成2×2随机矩阵,每个元素在0~1之间
print(n)
#求矩阵元素之和
print(np.sum(a))
#求矩阵中元素的最小值和最大值
print(np.min(a))
print(np.max(a))
b = np.arange(6).reshape(2,3)
print(b)
'''
如果你需要对行或者列进行查找运算,
就需要在上述代码中为 axis 进行赋值。
当axis的值为0的时候,将会以列作为查找单元,
当axis的值为1的时候,将会以行作为查找单元。
'''
print('sum1 = ', np.sum(b, axis=1)) #计算每行元素的和
print('sum0 = ', np.sum(b, axis=0)) #计算每列元素的和
print('max1 = ', np.max(b, axis=1)) #计算每行元素的最大值
print('min0 = ', np.min(b, axis=0)) #计算每列元素的最小值
'''
例5:多维矩阵运算:最大最小索引,矩阵元素均值、中位数,累加运算,累差运算,判断非0值的位置,排序,转置,chip函数
'''
import numpy as np
A = np.arange(2,14).reshape((3,4))
print(A)
# 最小元素索引
print(np.argmin(A))
# 最大元素索引
print(np.argmax(A))
# 求整个矩阵的均值
print(np.mean(A))
print(np.average(A))
print(A.mean())
# 求整个矩阵的中位数
print(np.median(A))
# 累加运算
print(np.cumsum(A))
# 累差运算
B = np.array([
[3,5,9],
[4,8,10]
])
print(np.diff(B))
'''
[[2 4]
[4 2]]
'''
#判断是否为0值
C = np.array([
[1,0,2],
[0,3,0]
])
print(np.nonzero(B))
print(np.nonzero(C))
'''
(array([0, 0, 0, 1, 1, 1], dtype=int64), array([0, 1, 2, 0, 1, 2], dtype=int64))
(array([0, 0, 1], dtype=int64), array([0, 2, 1], dtype=int64))
以矩阵C为例
C[0,0] C[0,2] C[1,1]三个元素值均不为0,返回的array实际上是索引的矩阵
'''
#排序
A = np.arange(14,2,-1).reshape((3,4))
print(A)
print(np.sort(A)) #对每行进行排序
#矩阵的转置
print(np.transpose(A))
print(A.T)
#chip函数
print(A)
print(np.clip(A,5,9)) #大于5的都用9代替
'''
clip(Array,Array_min,Array_max)
将Array_min<X<Array_max X表示矩阵A中的数,如果满足上述关系,则原数不变。
否则,如果X<Array_min,则将矩阵中X变为Array_min;
如果X>Array_max,则将矩阵中X变为Array_max.
'''
4.Numpy的索引和切片
'''
例6:输出一维、多维矩阵的单个元素输出,输出整行整列、多维矩阵转换为一维矩阵
'''
import numpy as np
A = np.arange(3,15)
print(A)
#输出单个元素
print(A[0],A[1],A[4])
B = A.reshape(3,4)
print(B)
print(B[1], B[0]) #[ 7 8 9 10] [3 4 5 6]
print(B[0][1]) #4
print(B[0,2]) #5
#切片操作
print(B[1,1:3]) #不包含最后一个元素 输出:[8 9]
for row in B:
print(row)
'''
[3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]
'''
# 如果要打印列,则进行转置即可
for column in B.T:
print(column)
'''
[ 3 7 11]
[ 4 8 12]
[ 5 9 13]
[ 6 10 14]
'''
#多维转一维
print(B)
print(B.flatten()) #[ 3 4 5 6 7 8 9 10 11 12 13 14]
for item in A.flat:
print(item)
5.Numpy数组的合并
'''
例7:数组的合并、数组转化为矩阵、纵向合并和横向合并
'''
import numpy as np
A = np.array([1,1,1])
B = np.array([2,2,2])
C = np.vstack((A,B))
# vertical stack 上下合并,对括号的两个整体操作
print(C)
print(A.shape, B.shape, C.shape)
# horizontal stack左右合并
D = np.hstack((A,B))
print(D)
print(D.shape)
print(A.shape,B.shape,D.shape)# (3,) (3,) (6,)
# 对于A,B这种,为数组或数列,无法进行转置,需要借助其他函数进行转置
print(A[np.newaxis,:]) #[1,1,1] 变为[[1,1,1]] 数组转化为矩阵
print(A[np.newaxis,:].shape) # (1, 3)
print(A[:,np.newaxis])
print(A[:,np.newaxis].shape) # (3, 1)
#多个矩阵合并
print('____________________')
A = A[:,np.newaxis]
B = B[:,np.newaxis]
print(A)
'''
[[1]
[1]
[1]]
'''
print(B)
'''
[[2]
[2]
[2]]
'''
# axis=0纵向合并
C = np.concatenate((A,B),axis = 0)
print(C)
'''
[[1]
[1]
[1]
[2]
[2]
[2]]
'''
# axis=1 横向合并
C = np.concatenate((A,B),axis = 1)
print(C)
'''
[[1 2]
[1 2]
[1 2]]
'''
print('____________________')
a = np.arange(8).reshape(2,4)
b = np.arange(8).reshape(2,4)
print(a)
'''
[[0 1 2 3]
[4 5 6 7]]
'''
print(b)
'''
[[0 1 2 3]
[4 5 6 7]]
'''
c = np.concatenate((a,b), axis = 0)
print(c)
'''
[[0 1 2 3]
[4 5 6 7]
[0 1 2 3]
[4 5 6 7]]
'''
c = np.concatenate((a,b), axis = 1)
print(c)
'''
[[0 1 2 3 0 1 2 3]
[4 5 6 7 4 5 6 7]]
'''
6.Numpy数组的分割
'''
例8:数组的等量分割、纵向横向分割、不等量分割
'''
import numpy as np
A = np.arange(12).reshape((3,4))
print(A)
'''
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
'''
# 等量分割
# 纵向分割同横向合并的axis
print(np.split(A,2,axis = 1))
'''
[array([[0, 1],
[4, 5],
[8, 9]]),
array([[ 2, 3],
[ 6, 7],
[10, 11]])]
'''
# 横向分割同纵向合并的axis
print(np.split(A,3,axis = 0))
'''
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
'''
#不等量分割
print(np.array_split(A,3,axis = 1))
'''
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2],
[ 6],
[10]]), array([[ 3],
[ 7],
[11]])]
'''
#其他分割方式
print(np.vsplit(A,3)) #等价于print(np.split(A,3,axis=0))
print(np.hsplit(A,2)) # 等价于print(np.split(A,2,axis=1))
7.Numpy的copy和=
'''
例9:= 赋值的关联性 copy赋值无关联性
'''
import numpy as np
# '=' 赋值方式带有关联性
a = np.arange(4)
print(a) # [0 1 2 3]
b = a
c = a
d = b
a[0] = 11
print(a) #[11 1 2 3]
print(b) #[11 1 2 3]
print(c) #[11 1 2 3]
print(d) #[11 1 2 3]
print(b is a) # True
print(c is a) # True
print(d is a ) # True
#copy 赋值无关联性
a = np.arange(4)
print(a) # [0 1 2 3]
b = a.copy()
print(b) # [0 1 2 3]
a[3] = 100
print(a) #[ 0 1 2 100]
print(b) #[0 1 2 3]
8.Numpy中的常用函数
'''
例10:np.bincount函数的使用
'''
import numpy as np
x = np.array([1, 2, 3, 3, 0, 1, 4])
np.bincount(x) # array([1, 2, 1, 2, 1], dtype=int64)
'''
统计索引出现次数:索引0出现1次,1出现2次,2出现1次,3出现2次,4出现1次
bin的数量比x中最大数多1,例如x最大为4,那么bin数量为5(index从0到4),
也就会bincount输出的一维数组为5个数,bincount中的数又代表的是它的索引值在x中出现的次数
'''
w = np.array([0.3,0.5,0.7,0.6,0.1,-0.9,1])
np.bincount(x,weights=w) #array([ 0.1, -0.6, 0.5, 1.3, 1. ])
'''
计算过程如下:
x ---> [1, 2, 3, 3, 0, 1, 4]
w ---> [0.3,0.5,0.7,0.6,0.1,-0.9,1] 索引 0 出现在x中index=4位置,那么在w中访问index=4的位置即可,w[4]=0.1
索引 1 出现在x中index=0与index=5位置,那么在w中访问index=0与index=5的位置即可,
然后将两这个加和,计算得:w[0]+w[5]=-0.6 其余的按照上面的方法即可!
'''
np.bincount(x,weights=w,minlength=7) #array([ 0.1, -0.6, 0.5, 1.3, 1. , 0. , 0. ])
'''
bin数量为5,index从0到4,那么当minlength为7的时候,也就是总长为7,index从0到6,多了后面两位,直接补位为0即可
'''
'''
例11:np.argmax函数的使用
'''
import numpy as np
x = [[1,3,3],
[7,5,2]]
print(np.argmax(x)) #3
# 7为最大元素,索引位置为3
x = [[1,3,3],
[7,5,2]]
print(np.argmax(x,axis=0)) # [1 1 0]
#axis=0表示按列操作,也就是对比当前列,找出最大值的索引
x = [[1,3,3],
[7,5,2]]
print(np.argmax(x,axis=1)) # [1 0]
#axis=1表示按行操作,也就是对比当前行,找出最大值的索引
x = np.array([1, 3, 2, 3, 0, 1, 0])
print(x.argmax()) # 1
#碰到重复最大元素,返回第一个索引值
参考资料:
《numpy-beginner》