python学习笔记(七)numpy的使用

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》

发布了20 篇原创文章 · 获赞 0 · 访问量 748

猜你喜欢

转载自blog.csdn.net/LeavingBook/article/details/104831819