Python科学计算库灬numpy

时间:2021-11-11 15:02:44

Numpy

NumPy是一个功能强大的Python库,主要用于对多维数组执行计算。Numpy许多底层函数实际上是用C编写的,因此它的矩阵向量计算速度是原生Python中无法比拟的。

numpy属性

维度(ndim)

# 创建二维数组
array = np.array([
    [1,2,3],
    [4,5,6],
    [7,8,9]
])
print(array.ndim)
# 2

形状(shape)

print(array.shape)
# (3,3)

大小(size)

print(array.size)
# 9

数据类型(dtype)

print(array.dtype)
# int32

创建array

a = np.array([1,2,3],dtype=np.float) # 创建一维数组,dtype指定元素类型
print(a.dtype)
# float64

d = np.array([  # 创建二维数组
    [2,3,4],
    [4,5,6],
    [6,7,8]
])
print(d)
#[[2 3 4]
# [4 5 6]
# [6 7 8]]

生成array

zero = np.zeros((2,3)) # 生成2行3列全为0的矩阵
print(zero)
#[[0. 0. 0.]
# [0. 0. 0.]]

one = np.ones((3,4)) # 生成3行4列全为1的矩阵
print(one)
#[[1. 1. 1. 1.]
# [1. 1. 1. 1.]
# [1. 1. 1. 1.]]

empty = np.empty((3,2)) # 生成3行2列全都接近于0(不等于0)的矩阵
print(empty)
#[[0. 0.]
# [0. 0.]
# [0. 0.]]

e = np.arange(10)
print(e)
# [0 1 2 3 4 5 6 7 8 9]

f = np.arange(4,12)
print(f)
# [ 4  5  6  7  8  9 10 11]

g = np.arange(1,20,3) # 步距3
print(g)
# [ 1  4  7 10 13 16 19]

h = np.arange(8).reshape(2,4) # 重新定义矩阵的形状
print(h)
#[[0 1 2 3]
# [4 5 6 7]]

arr3 = arr1 > 3 # 将判断结果存入arr3
print(arr3)
#[[False False False]
# [ True  True  True]]

print(arr1.T) # 矩阵转置
print(np.transpose(arr1)) # 矩阵转置

矩阵运算

以下运算都是两矩阵形状一致才能进行,因为都是对应位置上的元素逐一运算。

加法运算

arr1 = np.array([
    [1,2,3],
    [4,5,6]
])

arr2 = np.array([
    [1,1,2],
    [2,3,4]
])

print(arr1 + arr2)
#[[ 2  3  5]
# [ 6  8 10]]

减法运算

print(arr1 - arr2)
#[[0 1 1]
# [2 2 2]]

乘法运算

print(arr1 * arr2)
#[[ 1  2  6]
# [ 8 15 24]]

# 两矩阵相乘
np.dot(arr1,arr2)
arr1.dot(arr2)

除法运算

print(arr1 / arr2)
#[[1.         2.         1.5       ]
# [2.         1.66666667 1.5       ]]

幂运算

print(arr1 ** arr2)
#[[   1    2    9]
# [  16  125 1296]]

取余运算

print(arr1 % arr2)
#[[0 0 1]
# [0 2 2]]

取整运算

print(arr1 // arr2)
#[[1 2 1]
# [2 1 1]]

随机数生成及矩阵运算

sample1 = np.random.random((3,2)) # 生成3行2列从0到1的随机数
print(sample1)
# [[0.23880087 0.36963104]
#  [0.12920673 0.19140641]
#  [0.29037101 0.41021395]]

sample2 = np.random.normal(loc=0,scale=1,size=(3,2)) # 生成3行2列符合标准正态分布的随机数
print(sample2)
#[[ 0.12024487 -0.71771871]
# [ 1.18751981  0.55059626]
# [-0.36288479  0.48795296]]

sample3 = np.random.randint(0,10,size=(3,2)) # 生成3行2列从0到10的随机整数
print(sample3)
#[[9 8]
# [4 2]
# [8 9]]

np.sum(sample3) # 矩阵所有元素求和
np.sum(sample3,axis=0) # axis=0表示对列求和
np.sum(sample3,axis=1) # axis=1表示对行求和
# 40
# array([21, 19])
# array([17,  6, 17])

np.min(sample3) # 矩阵元素最小值
np.argmin(sample3) # 求最小值的索引
# 2
# 3

np.max(sample3) # 矩阵元素最大值
np.argmax(sample3) # 求最大值的索引
# 9
# 0

np.mean(sample3) # 求平均值
# 6.666666666666667

np.median(sample3) # 取中位数
# 8.0

np.sqrt(sample3) # 元素逐一开方
# array([[3.        , 2.82842712],
#       [2.        , 1.41421356],
#       [2.82842712, 3.        ]])

排序

sample4 = np.random.randint(0,10,size=(1,10))
print(sample4)
# [[0 9 4 4 1 1 4 3 2 9]]

print(np.sort(sample4)) # 对数组排序
# [[0 1 1 2 3 4 4 4 9 9]]

sample3 = [
    [9 8],
    [4 2],
    [8 9]
]
print(np.sort(sample3,axis=0)) # 列排序
print(np.sort(sample3,axis=1)) # 行排序
print(np.sort(sample3,axis=None)) # axis=None,先进行扁平化处理,再排序
#[[4 2]
# [8 8]
# [9 9]]
#[[8 9]
# [2 4]
# [8 9]]
#[2 4 8 8 9 9]

限定矩阵元素范围

np.clip(sample3,a_min=3,a_max=6) # 限定sample中的元素范围,小于a_min的变为a_min,大于a_mxa的变为a_max
#array([[6, 6],
#       [4, 3],
#       [6, 6]])

numpy索引

arr1 = np.arange(2,14)
print(arr1)
# [ 2  3  4  5  6  7  8  9 10 11 12 13]

print(arr1[2]) # 索引从0开始
# 4

print(arr1[1:4]) # 切片,索引从1开始到4(不含4)
# [3 4 5]

print(arr1[2:-1]) # 索引从2到倒数第1个位置(不含倒数第1)
# [ 4  5  6  7  8  9 10 11 12]

print(arr1[:5]) # 从开始取到索引5(不含5)
# [2 3 4 5 6]

print(arr1[-2:]) # 索引倒数第2到最后
# [12 13]

arr2 = arr1.reshape(3,4)
print(arr2)
#[[ 2  3  4  5]
# [ 6  7  8  9]
# [10 11 12 13]]

print(arr2[1])
print(arr2[1][2])
print(arr2[1,2]) # 等价于arr2[1][2]
#[6 7 8 9]
#8
#8

print(arr2[:,2]) # 取所有行第2列
# [ 4  8 12]

for i in arr2: # 迭代行
    print(i)
# [2 3 4 5]
# [6 7 8 9]
# [10 11 12 13]

for i in arr2.T: # 迭代列
    print(i)
# [ 2  6 10]
# [ 3  7 11]
# [ 4  8 12]
# [ 5  9 13]

for i in arr2.flat: # 扁平化
    print(i)
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10
# 11
# 12
# 13

array的合并

arr1 = np.array([1,2,3])
arr2 = np.array([4,5,6])
arr3 = np.vstack((arr1,arr2)) # 垂直合并
print(arr3,arr3.shape)
# [[1 2 3]
#  [4 5 6]] (2, 3)

arr4 = np.hstack((arr1,arr2)) # 水平合并
print(arr4,arr4.shape)
# [1 2 3 4 5 6] (6,)

arrv = np.vstack((arr1,arr2,arr3)) # 多个矩阵合并
print(arrv,arrv.shape)
# [[1 2 3]
#  [4 5 6]
#  [1 2 3]
#  [4 5 6]] (4, 3)

concatenate矩阵合并

concatenate必须同维数组才能合并。

arr5 = np.concatenate((arr3,[arr1]),axis=0) # concatenate必须同维数组才能合并,arr1是一维,只能加个[]转为二维才能合并
print(arr5) # axis = 0 垂直合并
# [[1 2 3]
#  [4 5 6]
#  [1 2 3]]

arr6 = np.concatenate((arr3,[[1],[2]]),axis=1) #水平合并
print(arr6) # axis = 1 水平合并
# [[1 2 3 1]
#  [4 5 6 2]]

arr10 = np.atleast_2d(arr1) # 将矩阵变为至少二维矩阵,大于2不生效
print(arr10)
# [[1 2 3]]

array分割

arr1 = np.arange(12).reshape((3,4))
print(arr1)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

arr2,arr3 = np.split(arr1,2,axis=1) # 水平方向分割,分成2分
print(arr2)
print(arr3)
#[[0 1]
# [4 5]
# [8 9]]
#[[ 2  3]
# [ 6  7]
# [10 11]]

arr4,arr5,arr6 = np.split(arr1,3,axis=0) # 垂直方向分割,分成2分
print(arr4)
print(arr5)
print(arr6)
# [[0 1 2 3]]
# [[4 5 6 7]]
# [[ 8  9 10 11]]

array拷贝

arr1 = np.array([1,2,3])

# 浅拷贝
arr2 = arr1 # 不同指针,指向同一块内存,浅拷贝
arr2[0] = 5
print(arr1)
print(arr2)
# [5 2 3]
# [5 2 3]

# 深拷贝
arr3 = arr1.copy() # 深拷贝,重新开辟内存空间
arr3[0] = 10
print(arr1)
print(arr3)
# [5 2 3]
# [10  2  3]