首页 > 其他分享 >Numpy库的解析

Numpy库的解析

时间:2024-05-29 12:33:14浏览次数:25  
标签:函数 索引 维度 数组 np 解析 Numpy 运算

一些重要的性质:

1.Numpy库创建一个数组,创建的数组的大小是无法改变的。

2.数学中一维数据叫向量,二维数据叫做矩阵,三维数据叫做张量。在Numpy中每一个维度叫做轴。

3.可以利用多维数组的.ndim属性查看数组有几个维度,可以使用.shape()看每一个轴的长度,可以使用size来查看两个轴长度的乘积

 Numpy的基本函数总结:

1.np.array()      ##这个函数可以创建一个多维数组对象,参数是嵌套列表。(这里一定要注意的就是这个嵌套列表一定要是能够变成数组对象)

import numpy as np
a = np.array([[1, 2], [2, 3]])
print(a)


output:
[[1 2]
 [2 3]]


提示:
要想嵌套列表能够变成数组对象,一定要保证列表的维度上的每一个元素都存在,
简单的理解就是,以以上例子为例,
我可以用[[1, 2], [2, 3]],但是不可以用[[1, 2], 1, 2]。 

2.np.zeros()      ##这个函数创建一个全是零的多维数组对象,参数是shape对象

3.np.ones()       ##这个函数创建一个全部都是1的多维数组对象,参数是一个shape对象

4.np.arange()    ##这个函数创建一个一维的数组对象,参数分别是起始,结束,步长(可以是小数,这也是它优于range函数的表现)

5.np.linspace()  ##这个函数和arange函数是类似的,但是参数是起始,结束,元素个数

提示:在以上五个函数当中,我们可以使用dtype=int32/int64/float64/float32等的方法来直接定义数组的类型(这有点像申明数据类型)

下面我对可以作为dtype参数的类型进行一个汇总:

np.int32  默认为整数,有符号32位的整型

np.int64  有符号64位的整型

np.float64  有双精度的64位的浮点型

np.float32   有单精度32位的浮点型

np.complex64  有双精度的64位的复数型

提示:这里的int64和float64可以写成int_,float_来进行代替。

 特别注意:对于浮点数而言,存在一个inf的值和nan值,可以使用np.inf和np.nan来进行表示,其中inf表示无穷数,nan表示缺省值。

数组的基本运算和广播运算:

一、基本运算

numpy对象的加减乘除运算一般来说是针对相同形状(即shape是一样的)数组的,运算相当于对应的元素直接相加减乘除。

二、广播运算

如果两个numpy对象是不同形状的(也就是shape是不相等的)也可以进行基本运算,计算常见以下几类:

1.numpy对象和一个数进行运算,这时就是这个数直接扩展为与numpy对象一样的shape后与numpy对象进行基本运算

2.当两个numpy对象运算时,numpy会自动将维度更小的数组在新的纬度上进行复制,实现相同纬度再进行逐元素的运算(这里一定要保证维度小的数组长度和大的纬度数组的最后一个维度的长度相等。

例如小维度数组shape=(1, 2, 3),大维度数组shape=(4, 1, 2, 3)【这里后三个维度1,2,3必须相等】,再比如小维度数组为shape=(1,2),大维度数组shape=(4,2,4,4,1,2)【这里最后两个维度1,2必须相等即可广播运算】)

以下代码举例:

import numpy as np
a = np.zeros((1, 2))
b = np.ones((2, 1, 2))
print(a + b)


output:
[[[1. 1.]]

 [[1. 1.]]]

特别注意:比较运算符也可以进行数组间基本运算的,这时候得到的是全是bool数的数组,这在后面的数组的索引中应用很广泛。

多维数组的索引和切片:

一、索引:

可以选用:来进行切片取想要的数组或者使用::进行切片,这里的:和::和列表索引完全一样用法,数组中以[a:b, c:d, e:f]来进行切片索引(其中a,b...都是随意整数,:可以换为::)

二、高级索引:

  • 逻辑索引:(这个是我们平常用的最多的,也是最好用的)

使用bool数组作为索引来挑选True的数组元素并生成一个新的多维数组

a=np.array([[1,2,3], [2,3,4], [3,4,5]])
# 如果想要将a中大于4的数字挑选出来那么使用下面的逻辑索引进行挑选
print(a[a>4])

# 再次提示这里a>4就会生成一个
[[False False False]
 [False False False]
 [False False  True]]
# 根据生成的这个bool数组将对应位置是True的挑选出来


output:
[5]


# 这里针对二维数组的最后一维筛选
print(a[a[:, 2]> 4])
# a[:, 2]>4得到的是一个这样的bool数组:
[False False  True]
# 这时进行索引得到的是

output:
[[3 4 5]]

特别注意:

1.如果我们逻辑索引是全部维度的数进行比较运算得到的bool数组,那么numpy就会破坏其维度将其平铺为一维的数组。

2.一般来说二维数组应用最多,如果是针对二维数组第二个维度中的数字进行比较得到的bool判断数组,那么将可以进行类似Excel筛选的功能,将某列满足条件的筛选出来同时其他列的元素跟着筛选。

3.比二维更高维的数组逻辑索引只有当除了最后一维的索引值不是:,其他维索引值都是:才可以使用,这时得到的bool判断数组维数是这个高维数组维数-1,最后索引得到的数组是一个二维数组

  • 花式索引

numpy还可以进行多个索引的指定选取

例如:

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


# 这里是对索引为(1,1)和(2,2)的进行提取
output:
[3, 5]

数组的形状的变换reshape函数

提示:数组的元素是不可变的,但是数组的形状是可以变化的,可以使用reshape()对数组的形状的进行设定,reshape中的参数是每个维度的长度,其中最后一个要写的维度可以直接填写为-1表示python自动根据原数组的size计算最后一维的长度。(常用-1将数组平铺)【具体例子见下面讲解】

轴变换函数transpose函数

transpose函数是将二维或者二维以上的数组进行轴的变化,如果是二维数组不需要加参数相当于矩阵的转置,三维数组及以上维度数组需要提供参数(几维就提供几个参数,例如对三维数组提供(1, 0, 2)就相当于将这个三维数组的第0维和第1维进行转换)

提示:transpose函数变换的法则是,以三维数组提供(1,0,2)参数为例,相当于把原来在数组【1】【2】【1】位置的元素变成了在新数组的【2】【1】【1】位置。(例如【1】【2】【1】表示在第一个维度的第一个索引位置,第二个维度的第二个索引位置,第三个维度的第一个索引位置。)

多维数组的一些函数

 一、假设array为一个多维数组

1.array.mean(axis=())       # mean函数是求平均值函数,axis=这个参数可以指定是针对哪个纬度进行求平均,()内的参数可以多个表示对多个维度求平均,如果不输入axis参数默认为对所有维度求平均。

提示:array.mean()求值的本质是对求的维的那一个维度的下一个维度的元素进行相加,其中求多个维度的平均值时,求平均值的顺序随意。

2.array.max(axis=())        # max函数是求最大值函数,和mean函数是一样的本质操作【如果想要绕开nan值,用nanmax函数】

3.array.min(axis=())         # min类似与max

4.array.std(axis=())          # 求标准差函数

5.array.round()               # 对所有维度的元素进行四舍五入操作

6.array.astype()             # astype函数可以改变array元素的数据类型而创建一个新的数组

二、假设a是多维数组,b是一个多维数组

a.dot(b)  就是数组之间的点乘运算,在二维中就是矩阵的乘法运算,在三维甚至三维以上的情况就相当于把左乘和右乘的最后两个维度进行矩阵乘积然后前面的纬度进行矩阵相乘。

例如:

a = np.random.random((2, 2, 3))
b = np.random.random((1, 3, 2))
print(a)
print(b)
c = a.dot(b)
print(c)
print(c.shape)


# output:
# [[[0.97435814 0.15873357 0.0339072 ]
#   [0.21176906 0.477657   0.02888726]]
#
#  [[0.12952044 0.04369193 0.00348543]
#   [0.12679815 0.46684605 0.38734817]]]
# [[[0.2771934  0.37517756]
#   [0.97679599 0.08696438]
#   [0.20338993 0.7380475 ]]]
# [[[[0.43203235 0.4043866 ]]
#
#   [[0.5311498  0.14231032]]]
#
#
#  [[[0.07928921 0.05496521]]
#
#   [[0.56994368 0.37405214]]]]
# (2, 2, 1, 2)

解释:相当于本质上还是第一个多维数组的(2,3)和第二个数组的(3,2)相乘,当取a第一个维度2的第一个元素1时,取b第一个维度1的第一个元素的时候的得到的就是最终数组的【1】【2】【1】【2】位置的模块,同理取a第一个维度2的第二个元素2取b第一个维度1的第一个元素的时候得到的就是最终数组的【2】【2】【1】【2】位置的模块。

Numpy的函数

1.np.exp()          # 取指数e^              【逐个元素操作】

2.np.log()           # 取ln                      【逐个元素操作】

3.np.sqrt()          # 取根号                   【逐个元素操作】

4.np.sin()            # 取sin                    【逐个元素操作】

5.np.ceil()           # 向上取整           【逐个元素操作】

6.np.floor()        # 向下取整           【逐个元素操作】

7.np.genfromtxt(fname,dtype=float,delimiter=None,skip_header=0)   # fname表示文件路径,dtype表示引入到python程序中要变换的数据类型,delimeter为分隔符,skip_header表示跳过的行数

8.np.loadtxt(fname,dtype=float,skip_header=0)  【和genfromtxt类似,可以有效避免使用with open】

9.np.savetxt(fname, X,delimiter="")       # X表示一维或者二维数组,delimiter为分隔符

10.np.fabs()       # 全部取绝对值  【逐个元素操作】

举例:

下面我将以下面的两个个简单的例子来对numpy对象的基本运算,广播运算,索引进行讲解:

# -- coding:utf-8 --
import numpy as np
# 这里就可以不用with open了,可以直接用loadtxt,这可以直接避免增加行数
data = np.loadtxt(r"C:\Users\lvyih\Desktop\station_1989-2019.txt", dtype=int, skiprows=1)
summer = data[(data[:, 4] >= 6) & (data[:, 4] <= 8)]
temp = summer[:, 6].reshape(30, 92)
# 这里是该站点的夏季平均温度的逐日气候态,这里对第一个维度求平均是相当于对已经处理好的summer数据进行单日的30年数据求平均
temp_clm = temp.mean(axis=0)
print("summer daily climatology is:")
print(temp_clm)
# 以下是求解该站点的夏季平均气温的距平
temp_ano = temp - temp_clm
print("summer daily average temperature anomaly is")
print(temp_ano)

提示:

1.(data[:, 4] >=6) & (data[:, 4] <= 8)得bool判断矩阵作为data的逻辑索引以得到夏季数据,

2.reshape将summer数据变换成每一年的夏季的数据,再在axis=0求平均得到夏季平均温度的逐日气候态。

3.temp_ano=temp-temp_clm使用了广播运算,求得夏季平均气温的距平。

 

标签:函数,索引,维度,数组,np,解析,Numpy,运算
From: https://blog.csdn.net/lvyihang200411/article/details/139280016

相关文章

  • 深入探索 MongoDB:高级索引解析与优化策略
    MongoDB是一种非常流行的NoSQL数据库,它支持丰富的索引类型和功能,以提高数据查询的效率和性能。本文将详细介绍MongoDB的高级索引,包括基本语法、常用命令、示例、应用场景、注意事项和总结。基本语法在MongoDB中,可以使用createIndex()方法创建索引,语法如下:db.col......
  • 深入解析Java类加载机制:原理、过程与实践
    深入解析Java类加载机制:原理、过程与实践Java的类加载机制是Java虚拟机(JVM)运行时环境的核心组件,它决定了Java类和接口的加载、连接和初始化方式。这一机制不仅确保了应用程序的安全性和稳定性,还提供了灵活的动态加载能力,使得Java程序能够在运行时加载和使用外部类。这篇文......
  • 人脸识别——Webface-OCC遮挡人脸识别算法解析
    1.概述自2019年被誉为人脸识别技术的元年,各地纷纷引入这项技术。然而,自2020年起,为了抵御冠状病毒(COVID-19)的全球传播,人们普遍开始佩戴口罩。众所周知,现有人脸识别模型在面对遮挡物(如口罩)时,其识别精度会显著下降。这一现象的主要原因在于,现有数据集往往没有充分考虑遮挡因......
  • 全面解析开源RTSP流媒体服务器:功能、性能与应用场景对比
    本文综合分析了多个开源RTSP流媒体服务器,包括EasyDarwin、RtspServer、SRS等,深入探讨它们的功能特性、技术实现、性能对比及应用场景,旨在为开发者提供全面的选型参考。文章目录开源RTSP流媒体服务器概述RTSP协议简介开源RTSP服务器的重要性主要开源项目概览EasyDarwin......
  • 【DRF-08】rest-framework之解析器
    1.解析器的作用根据请求头content-type选择对应的解析器对请求体内容进行处理。有application/json,x-www-form-urlencoded,form-data等格式,可以自己自行配置支持或者不支持哪种格式,一般在实际的生产环境中用json一种数据格式进行数据交互就够了,如果需要form-data来进......
  • pandas解析csv
    前提:pipinstallpandas 总结:用DataFrame接收二维数组,用Series接收一维数组。DataFrame[列名]=Series列的内容。 importpandasaspd...defreadCSV(self):file=""data=pd.read_csv(file,encoding='utf-8')#DataFrame用来接收二维数组(矩阵)......
  • Nginx企业级负载均衡:技术详解系列(12)—— 深入解析root、alias及location
    你好,我是赵兴晨,97年文科程序员。在生产服务器的Nginx配置中,我们总会遇到形形色色的配置方案。你是否曾注意到root和alias指令的巧妙应用?是否对那些五花八门的location匹配规则感到好奇?今天,咱们来聊聊Nginx配置中root和alias以及location的详细使用。root与aliasroot:指......
  • NameCheap域名怎么样,如何注册购买域名?如何解析域名?
    Namecheap介绍Namecheap是一家国外域名注册商和网站托管公司,成立于2000年,提供域名注册、虚拟主机、电子邮件托管、SSL证书、免费的WHOIS保护、CDN、VPS主机和独立服务器。Namecheap怎么样?在Namecheap中注册、购买域名也是不需要备案的,价格方面相对于Namesilo来说也会便宜许多,操......
  • LLM 大模型学习必知必会系列(六):量化技术解析、QLoRA技术、量化库介绍使用(AutoGPTQ、A
    LLM大模型学习必知必会系列(六):量化技术解析、QLoRA技术、量化库介绍使用(AutoGPTQ、AutoAWQ)模型的推理过程是一个复杂函数的计算过程,这个计算一般以矩阵乘法为主,也就是涉及到了并行计算。一般来说,单核CPU可以进行的计算种类更多,速度更快,但一般都是单条计算;而显卡能进行的都是基......
  • 深入解析Nginx Location匹配规则:顺序详解与最佳实践
    目录Nginxlocation匹配顺序详解总结与最佳实践 Nginx的location匹配顺序是Nginx配置中非常核心且重要的概念,它决定了Nginx如何处理进入服务器的请求。理解location匹配顺序不仅有助于优化Nginx的性能,还能确保网站或应用的正确运行。下面将详细阐述Nginx的location匹......