栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Numpy库的学习

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Numpy库的学习

Numpy库是Python进行科学计算的基础库,它是一个由多维数组对象组成,包含数学运算、逻辑运算、形状操作、排序、选择、I/O、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等功能。

说明文档:NumPy 介绍 | NumPy 中文

1.数组的创建

import numpy as np
# 1.数组的创建
a=np.array([1,2,3],dtype=int) #创建一维数组,可指定元素类型
b=np.array([[1,2,3],[4,5,6]]) #创建二维数组
print(a)# [1 2 3]
print(b)
# [[1 2 3]
#  [4 5 6]]
a=np.arange(10)#默认从0开始
print(a)#[0 1 2 3 4 5 6 7 8 9]
a=np.arange(1,10)#左闭右开区间
print(a)#[1 2 3 4 5 6 7 8 9]
a=np.arange(1,10,2)#指定步幅为2
print(a)#[1 3 5 7 9]
a=np.linspace(1, 2, 5)#指定起止值,创建指定个数的等差一维数组
print(a)#[1.   1.25 1.5  1.75 2.  ]

a = np.zeros(3)	#创建一个只包含0的数组,列数为3,行数缺省为1
a=np.zeros((2,3))#创建一个m行n列的全0数组
print(a)
# [[0. 0. 0.]
#  [0. 0. 0.]]
a=np.ones((2,3))#创建一个m行n列的全1数组
print(a)
# [[1. 1. 1.]
#  [1. 1. 1.]]

z = np.empty(4)	#在内存中创建一个空数组,以备之后填入数据。
print(z)	#[2.95792101e-272 1.02380627e-306 3.96786093e-301 8.71907139e-301] 好像是随机创建的内容,没用

z = np.identity(2)#使用np.identity或者np.eye函数,创建单位矩阵
print(z)
# [[1. 0.]
#  [0. 1.]]

# 使用np.array函数,Python的列表,元组等也能转换为Numpy数组
a = np.array([10, 20]) # 使用列表构建数组
print(a)#[10 20]
b = np.array((10, 20), dtype=float) # 使用元组构建数组
print(b)#[10. 20.]
c = np.array([[1, 2], [3, 4]]) # 使用列表嵌套列表构建数组
print(c)
# [[1 2]
#  [3 4]]


# np.random.rand(m,n)或者np.random.random((m,n)
# 创建m行n列,由0-1的随机数构成的数组,注意后者传入的参数是一个元组
a=np.random.rand(2,3)#(3)也可以,行数缺省为1
print(a)
a=np.random.random((2,3))#((3))也可以,行数缺省为1
print(a)
# [[0.39640904 0.70625911 0.41037923]
#  [0.65263409 0.63491374 0.66204204]]
a = np.random.randint(0,3,(2,3))  #创建2行3列的二维数组,范围在[0-3)之间
print(a)
a=np.random.rand(2,3,4)#3维矩阵
print(a)
# [[[0.11838695 0.22200378 0.71420386 0.50389581]
#   [0.3725528  0.28242966 0.31213826 0.05534031]
#   [0.53484771 0.69017367 0.67676519 0.17627573]]
#
#  [[0.65290297 0.8464174  0.76181375 0.98847299]
#   [0.91528719 0.61851361 0.90388327 0.30164545]
#   [0.52912919 0.86626941 0.25378109 0.83821525]]]

a=np.indices((2,3,4))#np.indices的作用就是返回一个给定形状数组的序号网格数组,可以用于提取数组元素或对数组进行切片使用。
print(a)
# [[[[0 0 0 0]
#    [0 0 0 0]
#    [0 0 0 0]]
#
#   [[1 1 1 1]
#    [1 1 1 1]
#    [1 1 1 1]]]
#
#
#  [[[0 0 0 0]
#    [1 1 1 1]
#    [2 2 2 2]]
#
#   [[0 0 0 0]
#    [1 1 1 1]
#    [2 2 2 2]]]
#
#
#  [[[0 1 2 3]
#    [0 1 2 3]
#    [0 1 2 3]]
#
#   [[0 1 2 3]
#    [0 1 2 3]
#    [0 1 2 3]]]]

print(a.shape)#(3, 2, 3, 4)  第一个3是indices中参数的个数,后面的对应indices中的参数

2.数组的堆叠和拆分

import numpy as np
#2.数组的堆叠和拆分
a=np.array([0,1,2,3])#单独的[0,1,2,3]是列表
b=np.array([10,11,12,13])
c=np.vstack((a,b))#行堆叠,a和b数组的个数要一样
print(c)
# [[ 0  1  2  3]
#  [10 11 12 13]]
a=np.array([0,1,2,3])
b=np.array([10,11,12])
c=np.hstack((a,b))#列堆叠,a和b数组的个数可以不一样
print(c)#[ 0  1  2  3 10 11 12]

# 拆分
a=np.array([[0,1,2],
   [3,4,5],
   [6,7,8]])
b=np.vsplit(a,3)#按行拆分成3等分
print(b)#[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]
b,c,d=np.vsplit(a,3)
print(c)#[[3 4 5]]

b=np.vsplit(a,(2,)) #从第2行后面进行拆分
print(b)
# [array([[0, 1, 2],
#        [3, 4, 5]]), array([[6, 7, 8]])]
b,c=np.vsplit(a,(2,))
print(b)
# [[0 1 2]
#  [3 4 5]]
b=np.hsplit(a,3) #按列拆分成3等
print(b)
# [array([[0],
#        [3],
#        [6]]), array([[1],
#        [4],
#        [7]]), array([[2],
#        [5],
#        [8]])]

a=np.array([[0,1,2,10],
   [3,4,5,10],
   [6,7,8,10]])

b=np.hsplit(a,(1,3)) #分别从第二列和第3列后进行拆
print(b)
# [array([[0],
#        [3],
#        [6]]), array([[1, 2],
#        [4, 5],
#        [7, 8]]), array([[10],
#        [10],
#        [10]])]

3.运算

import numpy as np
# 3.运算
a = np.array([1,2,7,8])
b = np.array([5,6,3,2])
print(a + 10)# 对每个元素添加一个标量:[11 12 17 18]
print(a * 10)# 对每个元素乘一个标量:[10 20 70 80]
print(a+b)#[ 6  8 10 10]
print(a-b)#[-4 -4  4  6]
print(a*b)#[ 5 12 21 16]
print(a/b)#[0.2        0.33333333 2.33333333 4.        ]
print(a//b)#除后结果向下取整:[0 0 2 4]
print(a%b)#[1 2 1 0]
print(a**b)#代表乘方:[  1  64 343  64]
# 比较运算:==,<,<=,>,>=,!= 数组中每个元素都进行相应比较,返回bool值组成的数组
print(a==2)#[False  True False False]
# 逻辑运算:逻辑与(&),逻辑或(|)
print((a>3)&(a<10))#[False False  True  True]
print(a @ b)# 两个矩阵相乘:54

4.索引和切片

import numpy as np
#4.索引和切片
#一维数组
a = np.arange(10)
print(a)#[0 1 2 3 4 5 6 7 8 9]
print(a[0])#0
print(a[-1])#索引倒数第i个元素:9
print(a[0:8])#x[m:n],m到n-1的数据:[0 1 2 3 4 5 6 7]
print(a[0:8:2])#指定步幅为i:[0 2 4 6]
# 多维数组
z = np.array([[1, 2], [3, 4]])
print(z)
# [[1 2]
#  [3 4]]
print(z[0])#第一行:[1 2]
print(z[0, :])#第一行:[1 2]
print(z[:, 1])#第二列:[2 4]
print(z[0:2, 0])#前2行第1个数:[1 3]
print(z[0,0])#第1行第1个数:1

#索引数组
#单个索引数组
a = np.linspace(2,20,10,dtype=int)
print(a)#[ 2  4  6  8 10 12 14 16 18 20]
print(a[[1,2,3,4]])##传入列表索引和一维数组索引等效:[ 4  6  8 10]
print(a[np.array([1,2,3,4])])# #索引数组为一维数组:[ 4  6  8 10]
print(a[np.array([[1,2],[3,4]])])
##索引数组为二维数组:[[1,2],[3,4]],那么x[[[1,2],[3,4]]] 结果为[[x[1],x[2]],[x[3],x[4]]]
# [[ 4  6]
#  [ 8 10]]

a=np.array([[1,2],[3,4]])
b=np.array([[1,1],[0,1]])
print(a[b])#[[第2行,第2行],[第1行,第2行]]
# [[[3 4]
#   [3 4]]
#
#  [[1 2]
#   [3 4]]]

# 多个索引数组: 为多个维度提供索引,每个维度的索引数组必须具有相同的形状。
a = np.arange(16).reshape(4,4)
i = np.array([[0,1],[2,3]])
j = np.array([[2,1],[3,3]])
print(a)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]
#  [12 13 14 15]]
print(a[i,:])#[[第1行,第2行][第3行,第4行]]
# [[[ 0  1  2  3]
#   [ 4  5  6  7]]
#
#  [[ 8  9 10 11]
#   [12 13 14 15]]]
print(a[i,[2]])#[[第1行第3个,第2行第3个][第3行第3个,第4行第3个]]
# [[ 2  6]
#  [10 14]]
print(a[i,[2,1]])#[[第1行第3个,第2行第2个][第3行第3个,第4行第2个]]
# [[ 2  5]
#  [10 13]]
print(a[i,j])#[[第1行第3个,第2行第2个][第3行第4个,第4行第4个]]
# [[ 2  5]
#  [11 15]]
# print(a[np.array([[0,1],[2,3]]),np.array([[2,1],[3,3]])])
#从输出结果中可以看出,其实就是第1个array和第2个array中一一对应的
#   [[a[0][2],a[1][1]]
#   [a[2][3],a[3][3]]]

a = np.indices((2,3)) #创建一个3维数组
print(a)
# [[[0 0 0]
#   [1 1 1]]
#
#  [[0 1 2]
#   [0 1 2]]]
print(a[np.array([0,1]),np.array([0,1])] )#对前两个维度进行索引,结果相当于np.array([a[0][0],a[1][1]])
# [[0 0 0]
#  [0 1 2]]
print(a[np.array([0,1]),np.array([0,1]),np.array([1,2])] )#对3个维度分别索引,结果相当于np.array(a[0][0][1],a[1][1][2])
# [0 2]

#索引数组和整数相结合:将整数理解为和索引数组等长的以该整数为元素的数组

a = np.array([[1,2,3],[2,3,4],[3,4,5]])
print(a)
# [[1 2 3]
#  [2 3 4]
#  [3 4 5]]
print(a[np.array([1,2]),2])#[4 5]
print(a[np.array([1,2]),np.array([2,2])])#[4 5]
print(a[1,np.array([1,2])])#[3 4]
print(a[[1,1],np.array([1,2])])#[3 4]


# 布尔索引:与原始数组具有相同形状的布尔数组:在获取元素的时候,只返回索引值为True的元素所组成的数组,其它元素舍弃

a = np.array([[1,2,3],[2,3,4],[3,4,5]])
b = a > 3
print(b)
# [[False False False]
#  [False False  True]
#  [False  True  True]]
print(a[b]) #返回a中大于3的元素所组成的数组
# [4 4 5]
a[b] = 0 #赋值,只对索引数组中元素为True的位置进行赋值
print(a)
# [[1 2 3]
#  [2 3 0]
#  [3 0 0]]

# 对于数组的每个维度,给出一个一维布尔数组以及想要的切片。 请注意,一维布尔数组的长度必须与要切片的尺寸(或轴)的长度一致
a = np.arange(15).reshape((3,5))
print(a)
# [[ 0  1  2  3  4]
#  [ 5  6  7  8  9]
#  [10 11 12 13 14]]
b1 = np.array([True,False,True])
b2 = np.array([True, False, True, False, True])
print(a[b1,:])# 布尔类型的数据也可用于提取元素
# [[ 0  1  2  3  4]
#  [10 11 12 13 14]]
print(a[:,b2])
# [[ 0  2  4]
#  [ 5  7  9]
#  [10 12 14]]
z=np.arange(5)
d = np.array([0, 1, 1, 0, 0], dtype=bool)#也可以这样强制转换一下
print(d)#[False  True  True False False]
print(z[d])#[1 2]

 5.常用属性

import numpy as np
# 5.常用属性
a = np.arange(15).reshape((3,5))
print(a)
# [[ 0  1  2  3  4]
#  [ 5  6  7  8  9]
#  [10 11 12 13 14]]
print(a.ndim)#数组的轴(维度)的个数:2
print(a.shape)#数组的维度,对于m行n列的矩阵数组,返回的是(m,n):(3, 5)
print(a.size)#数组中所有元素的个数,等于shape的元素的乘积:15
print(a.dtype)#数组中元素类型的对象:int32
print(a.dtype.name)#数组中元素类型名称:int32
print(a.itemsize)#数组中每个元素的字节大小,比如元素类型为int64的数组,每个元素的字节大小为64/8=8个字节:4
print(a.T)#转置操作,不修改原数组:
# [[ 0  5 10]
#  [ 1  6 11]
#  [ 2  7 12]
#  [ 3  8 13]
#  [ 4  9 14]]

a = np.arange(15)
print(type(a)) # 
# 常见的数据类型包括:1. float64: 64 位浮点型数字,2. int64: 64 位整数型数字,3. bool: 8 位 True 或者 False。通常来说,默认的数据类型为float64。
print(type(a[0]))#
print(a.shape)#(15,)只有1行,所以只显示个数

6.常用方法

import numpy as np
#6.常用方法
a = np.arange(15) #创建一个一维数组
print(a)#[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
print(a.tolist()) #转成python列表形式 :[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
a.astype(float)#转换数组元素类型为float类型:
print(a.astype(float))#[ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9. 10. 11. 12. 13. 14.]
#修改数组形状:reshape不会修改原数组,resize会修改原数组
b = a.reshape(3,5) #修改数组为3行5列的二维数组
print(b)
# [[ 0  1  2  3  4]
#  [ 5  6  7  8  9]
#  [10 11 12 13 14]]
print(a) #reshape后,没有修改原数组:[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
a.resize(3,5) #resize修改了原数组
print(a)
# [[ 0  1  2  3  4]
#  [ 5  6  7  8  9]
#  [10 11 12 13 14]]

a = np.array((4, 3, 2, 1))
print(a)
print("sort =",a.sort())   # 对数组a进行排序
print("sum =",a.sum())  # 对数组a进行求和
print("mean =",a.mean())   # 求出数组a的均值
print("max =",a.max())   # 求出数组a的最大值
print("max =",a.min())   # 求出数组a的最小值
print("argmax =",a.argmax())   # 返回最大元素的索引
print("argmax =",a.argmin())   # 返回最小元素的索引
print("cumsum =",a.cumsum())   # 对每个元素累积求和:[ 1  3  6 10]
print("cumprod =",a.cumprod())    # 对每个元素累积求积:[ 1  2  6 24]
print("var =",a.var())  # 求数组a的方差
print("std =", a.std())   # 求数组a的标准差
a.shape = (2, 2)#a=a.reshape(2,2)
print(a)
# [[1 2]
#  [3 4]]
print(a.max(axis=1))   # axis=1,按行求最大(小)值 [2 4]
print(a.max(axis=0))   # axis=0,按列求最大(小)值 [3 4]
print(a.argmax(axis=1))# axis=1,按行求最大(小)值所对应的索引值 [1 1]
print(a.argmax(axis=0))# axis=1,按列求最大(小)值所对应的索引值 [1 1]

#将数组降维成一维数组:ravel和flatten都不会修改原数组
b=a.ravel() #降维成一维数组:[1 2 3 4]
b=a.flatten() #降维成一维数组:#ravel()和flatten()都没有修改原数组
print(b)#[1 2 3 4]

# Numpy数组中也存在深拷贝和浅拷贝的区别:
# 深拷贝即再内存中新建一个数据副本,两个数组内存地址不同,可以分别修改,浅拷贝即不在内存中新建地址,仅仅引用之前的地址,两个数组内存地址相同,只能同时修改
c = np.copy(b)	# 深拷贝
c[0] = 0
print(b)#[1 2 3 4]
print(c)#[0 2 3 4]
c = b		# 浅拷贝
c = b.view()# 浅拷贝
c[0] = 0
print(b)#[0 2 3 4]

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/951730.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号