numpy
程序员文章站
2022-05-20 11:10:20
一、NumPy简介: NumPy是python一个包。它是一个由多为数组对象和用于处理数字的例程集合组成的库。 二、Ndarray对象 NumPy中的数组类称为ndarray,ndarray是一系列同类型数据的集合,以0下标为开始进行集合的索引。 ndarray对象用于存放同类型元素的多维数组。 n ......
numpy矩阵
numpy:计算模块;主要有两种数据类型:数组和矩阵
特点:运算快
[]+[]
1、numpy创建矩阵
import numpy as np
mat1 = np.mat('1 2 3;2 3 4;1 2 2')
mat1
print(type(mat1))
<class 'numpy.matrixlib.defmatrix.matrix'>
mat2 = np.mat('1 3;4 7;2 4')
mat2
matrix([[1, 3],
[4, 7],
[2, 4]])
2、矩阵的计算
mat3 = np.mat('1 4 3;2 3 3;1 2 6')
print('矩阵加法运算:\n',mat1+mat3)
矩阵加法运算:
[[2 6 6]
[4 6 7]
[2 4 8]]
print('矩阵的乘法: \n',mat1*mat2)
矩阵的乘法:
[[15 29]
[22 43]
[13 25]]
print('矩阵的转置:\n',mat1.T)
矩阵的转置:
[[1 2 1]
[2 3 2]
[3 4 2]]
mat4 = np.mat('1 2 3;2 4 3;1 0 1')
print('逆矩阵: \n',mat4.I)
逆矩阵:
[[-0.66666667 0.33333333 1. ]
[-0.16666667 0.33333333 -0.5 ]
[ 0.66666667 -0.33333333 0. ]]
print('矩阵的数乘: \n',4*mat4)
矩阵的数乘:
[[ 4 8 12]
[ 8 16 12]
[ 4 0 4]]
print('对应元素相乘的运算: \n',np.multiply(mat1,mat3))
对应元素相乘的运算:
[[ 1 8 9]
[ 4 9 12]
[ 1 4 12]]
二、矩阵属性
print('矩阵的结构: \n',mat1.shape) # 几乘几的矩阵
矩阵的结构:
(3, 3)
print('矩阵的元素个数: \n',mat1.size) # 矩阵的元素的个数
矩阵的元素个数:
9
print('矩阵的元素类型: \n',mat1.dtype) # 矩阵的元素的类型
矩阵的元素类型:
int32
print('矩阵的维度: \n',mat1.ndim) # 矩阵的维度
矩阵的维度:
2
三、数组的创建
- 数组的所有运算都是对应元素的运算;
arr1 = np.array([1,2,3,4])
print(arr1) # [1 2 3 4]
print(type(arr1)) # <class 'numpy.ndarray'>
[1 2 3 4]
<class 'numpy.ndarray'>
#二维的数组
arr2 = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(arr2) # [[1 2 3]
# [4 5 6]
# [7 8 9]]
[[1 2 3]
[4 5 6]
[7 8 9]]
# 创建列向量类型的数组
arr3 = np.array([[1],[2],[3],[4]])
print(arr3)
#[[1]
#[2]
# [3]
# [4]]
#
[[1]
[2]
[3]
[4]]
2.数组的属性
print('一维数组的结构: ',arr1.shape) # 一维数组的结构: (4,)
print('二维数组的结构: \n',arr2.shape) # 二维数组的结构: (3, 3)
一维数组的结构: (4,)
二维数组的结构:
(3, 3)
print('一维数组元素的个数: ',arr1.size) # 一维数组元素的个数: 4
print('二维数组元素的个数: ',arr2.size) # 二维数组元素的个数: 9
一维数组元素的个数: 4
二维数组元素的个数: 9
print('一维数组元素的类型:',arr1.dtype) # 一维数组元素的类型: int32
print('二维数组元素的类型:',arr2.dtype) # 二维数组元素的类型: int32
一维数组元素的类型: int32
二维数组元素的类型: int32
print('一维数组元素的维度:',arr1.ndim) # 一维数组元素的维度: 1
print('二维数组元素的维度:',arr2.ndim) # 二维数组元素的维度: 2
一维数组元素的维度: 1
二维数组元素的维度: 2
3.数组的索引
# 一维数组的索引和切片:和python的列表和字符串一样
arr1[::-1] #
array([4, 3, 2, 1])
# 二维数组的切片: 数组名[行切片,列切片]
print(arr2)
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
arr2[1,2] # 6
arr2[1,0:2] # array([4, 5])
arr2[::2,::2] # array([[1, 3],
# [7, 9]])
arr2[1:,1:] # array([[5, 6],
# [8, 9]])
arr2[:2,::2] #array([[1, 3],
# [4, 6]])
[[1 2 3]
[4 5 6]
[7 8 9]]
array([[1, 3],
[4, 6]])
# 针对取出不同列不同行的元素 元组内对应坐标
# 取出数组中的1 ,5,9
arr2[(0,1,2),(0,1,2)]
# 取出2,4,6
arr2[(0,1,1),(1,0,2)]
# 取出3,5,7
arr2[(0,1,2),(2,1,0)]
array([3, 5, 7])
# bool取值 如果一个传入为行列取值,两个都传入代表元组取值
mask = np.array([1,0,1],dtype=np.bool)
print(mask)
[ True False True]
arr2[mask,:2] # true代表切,false代表不切
# array([[1, 2],
# [7, 8]])
# arr2[mask,mask] # array([1, 9])
array([[1, 2],
[7, 8]])
4.特殊函数创建数组
#(1) 类似于range
arr6 = np.arange(1,10,1)
print(arr6)
[1 2 3 4 5 6 7 8 9]
#(2) 等差数列:
# np.linspace(start=a1,stop=an,endpoint=True,retstep=False,dtype=None,=0) 第一项,最后一项,之间有几个数
# 参数说明
# endpoint = True:表示等差数列,在start与stop之间插入n-2个值:(n为数值的个数)
# endpoint = False:表示等差数列,在start和stop之间插入n-1个值,表示平均分成n份(n为数值的个数)
File "<ipython-input-28-6d811962123c>", line 4
endpoint = True:表示等差数列,在start与stop之间插入n-2个值:(n为数值的个数)
^
SyntaxError: invalid syntax
arr7 = np.linspace(2,5,5)
print(arr7)
# a1=8 d = -1 n = 7
arr8 = np.linspace(8,2,7)
print(arr8) # [ 8. 7. 6. 5. 4. 3. 2.]
#(3)等比数列
arr9 = np.logspace(1,5,5)
print(arr9)
# a1 = 2 , q = 2 , n= 10
arr10 = np.logspace(1,10,10,base=2)
print(arr10)
# a1 = 3 , q = 9 , n=6
arr10 =np.logspace(1,11,6,base=3)
print(arr10)
import math
# a1 = 2 q = 3 n = 5
arr11 = np.logspace(1,math.log2(162),5,base=2)
print(arr11)
# (4) 全一数组 ones
a1 = np.ones((2,3))
print(a1)
# (5)全零数组 zeros
a2 = np.zeros((3,3))
print(a2)
# (6)单位数组 eye
arr13 = np.eye(3)
print(arr13)
# (7)对角数组 diag
arr12 = np.diag([1,2,3,4])
print(arr12)
5.创建随机数组
# (1)创建n个0-1之间的一维随机数组
arr14 = np.random.random(10) # 创建的是10个0-1之间的一维的随机数组
print(arr14)
# (2)创建服从均匀分布的随机数组
arr15 = np.random.rand(100)
print(arr15)
import matplotlib.pyplot as plt
plt.figure()
plt.hist(arr15,10)
plt.show()
# (3)创建正态分布数组的随机数
arr16 = np.random.randn(10000)
plt.hist(arr16,10)
plt.show()
# (4)随机整数的生成 low <= x < high
# size可以是一个数,也可以是元组,(行,列)
np.random.randint(2,4,size=4).reshape((2,2))
np.random.randint(1,6,size=(3,9))
6.矩阵的形态变换
# (1)重置数组结构(reshape)
arr_1 = np.arange(10)
print(arr_1)
arr_2 =arr_1.reshape((2,5))
print(arr_2)
# (2)展平数组(ravel):二维-->一维 横向展平
arr_2.ravel()
# (3)展平数组(flatten) 默认为C 代表横向展平 F代表纵向展平
arr_2.flatten('C') # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr_2.flatten('F') # array([0, 5, 1, 6, 2, 7, 3, 8, 4, 9])
# (4)堆叠方法
arr_3 = np.zeros((3,4))
arr_4 = np.ones((3,4))
# 横向堆叠(hstack(tup)) 要求行数一致
arr_5 = np.hstack((arr_3,arr_4))
print(arr_5)
# 纵向堆叠(vstack(tup)) 要求列数一致
arr_6 = np.vstack((arr_3,arr_4))
print(arr_6)
# (5)数组合并 concatenate((a1, a2, ...), axis=0)
# 参数详情(a1,a2,a3,....)
# axis 哪个方向进行合并,默认为axis=0 纵向拼接 axis = 1 为横向拼接
arr_7 = np.concatenate((arr_3,arr_4),axis=1)
print(arr_7)
vstack,hstack和concatenate的区别
当数组为二维数组时,没有区别,当数组为一维数组时,它没有axis=1的轴,只有axis=0轴,vstack和hstack不会考虑维度的影响,只要符合条件,就能堆叠,vstack可以改变数组的维度,而concatenate要考虑维度的问题.
ar_1 = np.array([1,2,3,4])
ar_2 = np.array([1,2,3,4])
ar_3 = np.vstack((ar_1,ar_2))
print(ar_3)
# (6) 数组的分割 hsplit横向分割 vsplit纵向分割
# hsplit
arr_8 = np.hsplit(arr_7,4)
print(arr_8)
arr_9 = np.hsplit(arr_7,[4,6,7]) # 将数组按照列的索引分割成(元素个数+1)个数组
print(arr_9)
# vsplit
arr_10 = np.vsplit(arr_6,[1,3])
print(arr_10)
split(ary, indices_or_sections, axis=0)
参数说明
ary: m要切分的数组
indices_or_sections: 切分的要求
axis 切分的方向
注意: 使用的要求和concatenate是一样的
本文地址:https://blog.csdn.net/KWHua/article/details/111997911
上一篇: 前端基础之HTML
下一篇: 啥事儿都能幽默,真是对欢喜夫妻