一、概念介绍
numpy是Python的一个扩充程序库,支持高阶大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
对于数据的运算,用矩阵会比python自带的字典或者列表快好多
主要应用有:
- 数据分析
- 机器学习
- 深度学习
二、安装
请看: MAC/Windows/Linux环境numpy和pandas安装
三、numpy基本属性
1. 数组和矩阵运算:
import numpy as np
a = np.array([10,20,30,40])
b = np.arange(4)
print(a) #[10 20 30 40]
print(b) #[0 1 2 3]
c = a+b
print(c) #[10 21 32 43]
c = a-b
print(c) #[10 19 28 37]
c = a*b
print(c) #[ 0 20 60 120]
c = b/a
print(c) #[0. 0.05 0.06666667 0.075 ]
c= 10*np.sin(a)
print(c) #[-5.44021111 9.12945251 -9.88031624 7.4511316 ]
c= np.cos(a)
print(c) #[-0.83907153 0.40808206 0.15425145 -0.66693806]
c= np.tan(a)
print(c) #[ 0.64836083 2.23716094 -6.4053312 -1.11721493]
c= b**2
print(c) #[0 1 4 9]
print(b) #[0 1 2 3]
print(b<3) #[ True True True False]
print(b==3) #[False False False True]
a = np.array([[1,1],
[0,1]])
b = np.arange(4).reshape(2,2) #2行2列的矩阵
print(a)
#[[1 1]
# [0 1]]
print(b)
#[[0 1]
# [2 3]]
c = a*b
print(c) #矩阵乘法:1.对应元素相乘
# [[0 1]
# [0 3]]
c_dot = np.dot(a,b) #矩阵乘法:2.标准的矩阵乘法运算,即对应行乘对应列得到相应元素
print(c_dot)
#[[2 4]
# [2 3]]
#另外的一种关于dot的表示方法:
c_dot_2 = a.dot(b)
print(c_dot_2)
d= np.random.random((2,4)) #从0到1的随机数
#[[0.85495172 0.9741222 0.41543361 0.33450706]
# [0.58007087 0.43367435 0.72388887 0.16034378]]
print(d)
print(np.sum(d))
#4.476992464110268
print(np.sum(d,axis=1)) #each line,当axis的值为1的时候,将会以行作为查找单元
#[2.57901459 1.89797787]
print(np.min(d)) #0.16034377580836667
print(np.min(d,axis=0))#each column,当axis的值为0的时候,将会以列作为查找单元
#[0.58007087 0.43367435 0.41543361 0.16034378]
print(np.max(d))
#0.9741222029914546
代码连接:https://github.com/ziqiiii/Python_learning/blob/master/numpy1.py
2. 数组及矩阵的基本运算:
import numpy as np
a=np.arange(2,14).reshape((3,4))
print(a)
#[[ 2 3 4 5]
# [ 6 7 8 9]
# [10 11 12 13]]
print(np.argmin(a))#0,求矩阵中最小元素的索引
print(np.argmax(a))#11,求矩阵中最大元素的索引
print(np.mean(a))#计算统计中的均值,7.5
print(a.mean())
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))#有累差运算函数:该函数计算的便是每一行中后一项与前一项之差。
#故一个3行4列矩阵通过函数计算得到的矩阵便是3行3列的矩阵。
'''
[[1 1 1]
[1 1 1]
[1 1 1]]
'''
print(np.nonzero(a)) #这个函数将所有非零元素的行与列坐标分割开,重构成两个分别关于行和列的矩阵。
#(array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2]), array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]))
b=np.arange(14,2,-1).reshape(3,4)
print(b)
'''
[[14 13 12 11]
[10 9 8 7]
[ 6 5 4 3]]
'''
print(np.sort(b)) #排序函数仅针对每一行进行从小到大排序操作
'''
[[11 12 13 14]
[ 7 8 9 10]
[ 3 4 5 6]]
'''
#矩阵的转置有两种表示方法
print(np.transpose(b))
print(b.T)
'''
[[14 10 6]
[13 9 5]
[12 8 4]
[11 7 3]]
'''
print((b.T).dot(b))
'''转置后矩阵相乘:
[[332 302 272 242]
[302 275 248 221]
[272 248 224 200]
[242 221 200 179]]
'''
print(b)
'''
[[14 13 12 11]
[10 9 8 7]
[ 6 5 4 3]]
'''
print(np.clip(b,5,9))
'''这个函数的格式是clip(Array,Array_min,Array_max),
Array指的是将要被执行用的矩阵,而后面的最小值最大值则用于让函数
判断矩阵中元素是否有比最小值小的或者比最大值大的元素,
并将这些指定的元素转换为最小值或者最大值。
eg:
[[9 9 9 9]
[9 9 8 7]
[6 5 5 5]]
'''
print(b)
'''
[[14 13 12 11]
[10 9 8 7]
[ 6 5 4 3]]
'''
print(np.mean(b,axis=1)) #line
#[12.5 8.5 4.5]
print(np.mean(b,axis=0))#column
#[10. 9. 8. 7.]
代码连接:https://github.com/ziqiiii/Python_learning/blob/master/numpy2.py
3. 索引
import numpy as np
A = np.arange(3,15)
print(A) # [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
print(A[3]) # 6
A = np.arange(3,15).reshape(3,4)
print(A)
'''
[[ 3, 4, 5, 6]
[ 7, 8, 9, 10]
[11, 12, 13, 14]]
'''
print(A[2]) # [11, 12, 13, 14]
print(A[2][1]) # 12
print(A[2,1]) # 12
print(A[2,:]) # [11, 12, 13, 14]
print(A[:,1]) # [ 4 8 12]
print(A[1,2:3]) # [9]
print(A[1,1:3]) # [8 9]
for row in A:
print(row)
'''
[3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]
'''
for column in A:
print(column)
'''
[3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]
'''
print(A.T)
'''
[[ 3 7 11]
[ 4 8 12]
[ 5 9 13]
[ 6 10 14]]
'''
for column in A.T:
print(column)
'''
[ 3 7 11]
[ 4 8 12]
[ 5 9 13]
[ 6 10 14]
'''
#flatten是一个展开性质的函数,将多维的矩阵进行展开成1行的数列
print(A.flatten()) # [ 3 4 5 6 7 8 9 10 11 12 13 14]
#flat是一个迭代器,本身是一个object属性
for item in A.flat:
print(item)
'''
3
4
5
6
7
8
9
10
11
12
13
14
'''
代码链接: https://github.com/ziqiiii/Python_learning/blob/master/numpy3.py
4.矩阵/数组的合并
import numpy as np
A=np.array([1,1,1])
B=np.array([2,2,2])
C=np.vstack((A,B)) #vertical stack
D=np.hstack((A,B)) #horizontal stack
print(C)
'''
[[1 1 1]
[2 2 2]]
'''
print(D) # [1 1 1 2 2 2]
print(A.shape,C.shape) # ((3,), (2, 3))
print(A.shape,D.shape) # ((3,), (6,))
print(A.T) #[1 1 1]
print(A.T.shape) #(3,)
print(A.size) #3
print(A[:,np.newaxis]) # 转置操作
'''
[[1]
[1]
[1]]
'''
print(A.reshape(A.size,1))
'''
[[1]
[1]
[1]]
'''
#--------------------------------------------------
print('---------------------')
A=np.array([1,1,1])[:,np.newaxis]
B=np.array([2,2,2])[:,np.newaxis]
C=np.vstack((A,B)) #vertical stack
D=np.hstack((A,B)) #horizontal stack
print(C)
'''
[[1]
[1]
[1]
[2]
[2]
[2]]
'''
print(D) #
'''
[[1 2]
[1 2]
[1 2]]
'''
print(A.shape,C.shape) # (3, 1) (6, 1)
print(A.shape,D.shape) # (3, 1) (3, 2)
#--------------------------------------------------
print('---------------------')
C = np.concatenate((A,B,B,A),axis=0) #合并操作需要针对多个矩阵或序列
#axis参数很好的控制了矩阵的纵向或是横向打印
print(C)
"""
[[1]
[1]
[1]
[2]
[2]
[2]
[2]
[2]
[2]
[1]
[1]
[1]]
"""
D = np.concatenate((A,B,B,A),axis=1)
print(D)
"""
[[1 2 2 1]
[1 2 2 1]
[1 2 2 1]]
"""
5. 矩阵分割
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]]
"""
#纵向分割
print(np.split(A, 2, axis=1))
"""
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
"""
#横向分割
print(np.split(A, 3, axis=0))
# [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
#错误的分割: 范例的Array只有4列,只能等量对分,因此输入以上程序代码后Python就会报错。
#print(np.split(A, 3, axis=1))
# ValueError: array split does not result in an equal division
#不等量的分割
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))
# [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
print(np.hsplit(A, 2)) #等于 print(np.split(A, 2, axis=1))
"""
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
"""
6、copy & deep copy
import numpy as np
a = np.arange(4)
# array([0, 1, 2, 3])
b = a
c = a
d = b
print(a) #[0, 1, 2, 3]
a[0] = 11
print(a)
# array([11, 1, 2, 3])
print(b) #[11, 1, 2, 3]
d[1:3] = [22, 33] # array([11, 22, 33, 3])
print(a) # array([11, 22, 33, 3])
print(b) # array([11, 22, 33, 3])
print(c) # array([11, 22, 33, 3])
print(b is a) # True
print(c is a) # True
print(d is a) # True
#--------------------------------------
print('-------------------------------')
b = a.copy() # deep copy
print(b) # array([11, 22, 33, 3])
a[3] = 44
print(a) # array([11, 22, 33, 44])
print(b) # array([11, 22, 33, 3])