Numpy

2023-11-05

1.Numpy是什么?

NumPy(Numerical Python)是一个强大的Python数值计算库。它提供对大型多维数组和矩阵的支持,并提供了许多高效操作这些数组的数学函数。 NumPy是Python科学计算的基础库,在诸如机器学习、数据科学、工程学和研究等领域得到广泛应用。
在这里插入图片描述
要使用NumPy,首先需要安装它。可以使用pip安装它:

pip install numpy

Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用Python要简洁的多。

2.ndarray

2.1 什么是ndarray?

NumPy提供了一个N维数组类型ndarray,它描述了相同类型的“items”的集合。
ndarray(N维数组)是NumPy库中最重要的数据结构之一。它是一个多维、同类型数据的容器,可以存储在内存中的连续块,提供了许多功能和操作来高效地处理大规模数值数据。
机器学习的最大特点就是大量的数据运算,那么如果没有一个快速的解决方案,那可能现在python也在机器学习领域达不到好的效果。
Numpy专门针对ndarray的操作和运算进行了设计,所以数组的存储效率和输入输出性能远优于Python中的嵌套列表,数组越大,Numpy的优势就越明显。
在这里插入图片描述
ndarray到底跟原生python列表有什么不同呢,请看一张图:
在这里插入图片描述
从图中我们可以看出ndarray在存储数据的时候,数据与数据的地址都是连续的,这样就给使得批量操作数组元素时速度更快。
这是因为ndarray中的所有元素的类型都是相同的,而Python列表中的元素类型是任意的,所以ndarray在存储元素时内存可以连续,而python
原生list就只能通过寻址方式找到下一个元素
,这虽然也导致了在通用性能方面Numpy的ndarray不及Python原生list,但在科学计算中,Numpy
的ndarray就可以省掉很多循环语句,代码使用方面比Python原生list简单的多。此外ndarray支持并行化运算(向量化运算)。

使用numpy生成一个数组

import numpy as np

#使用numpy生成一个数组
a=np.array([1,2,3,4,5,6])
a

在这里插入图片描述

2.2 ndarray的属性

在这里插入图片描述

2.3 ndarray的类型

在这里插入图片描述

import numpy as np

# 创建不同形状的数组
# 二维数组
a=np.array([[1,2,3],[4,5,6]],dtype=int)
# 一维数组
b=np.array([1,2,3,4,5],dtype=int)
# 三维数组
c=np.array([[[1,2,3],[4,5,6]],[[2,7,8],[3,6,9]]],dtype=int)

# 打印数组的形状
a.shape
b.shape
c.shape

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.Numpy基本操作

3.1 生成0或1的数组

在这里插入图片描述

import numpy as np

#生成全是1的数组
np.ones([4,8])
ones

#生成全是0的数组
zeros=np.zeros([4,8])
zeros

在这里插入图片描述
在这里插入图片描述

3.2 从现有数组生成数组

在这里插入图片描述
当创建新的数组时,numpy.array() 默认会复制数据,以确保创建的数组与原始数据没有共享内存。这是所谓的“拷贝”操作。
numpy.asarray() 不会执行拷贝操作,而只是将该数组返回,这有助于节省内存和提高性能。

import numpy as np

a = np.array([[1,2,3],[4,5,6]])
# 从现有的数组当中创建
a1 = np.array(a)
# 相当于索引的形式,并没有真正的创建一个新的
a2 = np.asarray(a)
拓展:浅拷贝和深拷贝

**浅拷贝是创建一个新的数据结构,并复制原始数据结构中的元素。**如果原始数据结构是一个单层结构(没有嵌套的对象),那么浅拷贝将复制所有元素。但是,如果原始数据结构中有嵌套的对象(如列表中嵌套了另一个列表,或字典中嵌套了另一个字典),浅拷贝将不会递归复制嵌套对象,而是复制它们的引用。
深拷贝是创建一个新的数据结构,并递归复制原始数据结构中的所有元素,包括嵌套对象。 这意味着原始数据结构中的每个元素及其嵌套的元素都将在新数据结构中独立存在,不共享引用。

3.3 生成固定范围的数组

np.linspace (start, stop, num, endpoint)
创建等差数组 — 指定数量

参数:
start:序列的起始值
stop:序列的终止值
num:要生成的等间隔样例数量,默认为50
endpoint:序列中是否包含stop值,默认为ture

np.linspace(0,100,11)

在这里插入图片描述

np.arange(start,stop, step, dtype)
创建等差数组 — 指定步长

参数 step:步长,默认值为1

np.arange(40,50,1)

在这里插入图片描述
np.logspace(start,stop, num)
创建等比数列

参数:
num:要生成的等比数列数量,默认为50

logspace(1, 3, 5) 返回一个包含 5 个均匀分布在对数刻度上的数据点的数组。这些数据点分别是 101,101.5,102,102.5 和 10^3。

3.4 生成随机数组

3.4.1 正态分布

正态分布是一种概率分布。正态分布是具有两个参数μ和σ的连续型随机变量的分布,第一参数μ是服从正态分布的随机变量的均值,第二个参数σ是此随机变量的标准差,所以正态分布记作N(μ,σ )。在这里插入图片描述
μ决定了其位置,其标准差σ决定了分布的幅度。当μ = 0,σ = 1时的正态分布是标准正态分布。在这里插入图片描述
正态分布的创建:

np.random.randn(d0, d1, …, dn)
功能:从标准正态分布中返回一个或多个样本值

np.random.normal(loc=0.0, scale=1.0, size=None) (常用)
loc:float 此概率分布的均值(对应着整个分布的中心centre)
scale:float 此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)
size:int or tuple of ints
输出的shape,默认为None,只输出一个值

np.random.standard_normal(size=None)
返回指定形状的标准正态分布的数组。

eg:生成均值为1.75,标准差为1的正态分布数据,100000000个

import numpy as np
import matplotlib.pyplot as plt

x1=np.random.normal(1.75,1,100000000)

# 创建画布
plt.figure(figsize=(20,10),dpi=100)

# 绘制直方图
plt.hist(x1,1000)

# 显示
plt.show()

在这里插入图片描述

3.4.2 均匀分布

均匀分布是概率论和统计学中的一种重要概率分布,也称为均匀随机变量分布。在均匀分布中,所有可能的结果在某个范围内是等可能发生的,没有任何一个结果比其他结果更有可能发生。

np.random.rand(d0, d1, …, dn) 返回[0.0,1.0)内的一组均匀分布的数。

np.random.uniform(low=0.0, high=1.0, size=None) (常用)
功能:从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开,即包含low,不包含high. 参数介绍: low:
采样下界,float类型,默认值为0; high: 采样上界,float类型,默认值为1;
size:
输出样本数目,为int或元组(tuple)类型,例如,size=(m,n,k), 则输出mnk个样本,缺省时输出1个值。
返回值:ndarray类型,其形状和参数size中描述一致。

np.random.randint(low, high=None, size=None, dtype=‘l’)
从一个均匀分布中随机采样,生成一个整数或N维整数数组,
取数范围:若high不为None时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数。

import numpy as np
import matplotlib.pyplot as plt

x1=np.random.uniform(-1,1,100000000)

# 创建画布
plt.figure(figsize=(20,10),dpi=100)

# 绘制直方图
plt.hist(x1,1000)

# 显示
plt.show()

在这里插入图片描述

3.5 形状修改

ndarray.reshape(shape, order)
返回一个具有相同数据域,但shape不一样的视图
行、列不进行互换

# 在转换形状的时候,一定要注意数组的元素匹配
stock_change.reshape([5, 4])
stock_change.reshape([-1,10]) # 数组的形状被修改为: (2, 10), -1: 表示通过待计算

ndarray.resize(new_shape)
修改数组本身的形状(需要保持元素个数前后相同)
行、列不进行互换

stock_change.resize([5, 4])
# 查看修改后结果
stock_change.shape
(5, 4)

ndarray.T
数组的转置
将数组的行、列进行互换

3.6 类型修改

ndarray.astype(type)
返回修改了类型之后的数组

3.7 数组的去重

np.unique()

import numpy as np

a=np.array([[1,2,3,4],[2,3,4,5],[5,6,7,7]])
b=np.unique(a)
b

在这里插入图片描述

3.8 数组的索引以及切片

直接进行索引,切片
对象[:, :] – 先行后列

import numpy as np

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

在这里插入图片描述

4.ndarray运算

4.1 逻辑运算

# 生成10名同学,5门功课的数据
>>> score = np.random.randint(40, 100, (10, 5))
# 取出最后4名同学的成绩,用于逻辑判断
>>> test_score = score[6:, 0:5]
# 逻辑判断, 如果成绩大于60就标记为True 否则为False
>>> test_score > 60
array([[ True, True, True, False, True],
[ True, True, True, False, True],
[ True, True, False, False, True],
[False, True, True, True, True]])
# BOOL赋值, 将满足条件的设置为指定的值-布尔索引
>>> test_score[test_score > 60] = 1
>>> test_score
array([[ 1, 1, 1, 52, 1],
[ 1, 1, 1, 59, 1],
[ 1, 1, 44, 44, 1],
[59, 1, 1, 1, 1]])
通用判断函数

np.all() 全部符合条件才为true

# 判断前两名同学的成绩[0:2, :]是否全及格
>>> np.all(score[0:2, :] > 60)
False

np.any() 有一个符合条件就为true

# 判断前两名同学的成绩[0:2, :]是否有大于90分的
>>> np.any(score[0:2, :] > 80)
True

np.where 三元运算符

# 判断前四名学生,前四门课程中,成绩中大于60的置为1,否则为0
temp = score[:4, :4]
np.where(temp > 60, 1, 0)

复合逻辑需要结合np.logical_and和np.logical_or使用

 # 判断前四名学生,前四门课程中,成绩中大于60且小于90的换为1,否则为0
np.where(np.logical_and(temp > 60, temp < 90), 1, 0)
# 判断前四名学生,前四门课程中,成绩中大于90或小于60的换为1,否则为0
np.where(np.logical_or(temp > 90, temp < 60), 1, 0)

4.2 统计运算

在这里插入图片描述
进行统计的时候,axis 轴的取值并不一定,Numpy中不同的API轴的值都不一样,在这里,axis 0代表列, axis 1代表行去进行统计

# 接下来对于前四名学生,进行一些统计运算
# 指定列 去统计
temp = score[:4, 0:5]
print("前四名学生,各科成绩的最大分:{}".format(np.max(temp, axis=0)))
print("前四名学生,各科成绩的最小分:{}".format(np.min(temp, axis=0)))
print("前四名学生,各科成绩波动情况:{}".format(np.std(temp, axis=0)))
print("前四名学生,各科成绩的平均分:{}".format(np.mean(temp, axis=0)))

np.argmax(temp, axis=)
np.argmin(temp, axis=)
找出最大和最小元素的坐标

4.3 数组间的运算

4.3.1 广播机制

数组在进行矢量化运算时,要求数组的形状是相等的。当形状不相等的数组执行算术运算的时候,就会出现广播机制,该机制会对数组进行扩
展,使数组的shape属性值一样,这样,就可以进行矢量化运算了。下面通过一个例子进行说明:

arr1 = np.array([[0],[1],[2],[3]])
arr1.shape
# (4, 1)
arr2 = np.array([1,2,3])
arr2.shape
# (3,)
arr1+arr2
# 结果是:
array([[1, 2, 3],
[2, 3, 4],
[3, 4, 5],
[4, 5, 6]])

上述代码中,数组arr1是4行1列,arr2是1行3列。这两个数组要进行相加,按照广播机制会对数组arr1和arr2都进行扩展,使得数组arr1和arr2
都变成4行3列。
在这里插入图片描述
在这里插入图片描述

5 矩阵的运算

5.1 矩阵乘法

np.matmul和np.dot的区别:
二者都是矩阵乘法。
np.matmul中禁止矩阵与标量的乘法。 在矢量乘矢量的內积运算中,np.matmul与np.dot没有区别。

np.matmul

import numpy as np
a=np.array([[81,52],[50,51],[3,5]])
b=np.array([[40,41,22],[30,31,56]])
np.matmul(a,b)

np.dot

import numpy as np
a=np.array([[81,52],[50,51],[3,5]])
b=np.array([[40,41,22],[30,31,56]])
np.dot(a,b)

运行结果:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Numpy 的相关文章

随机推荐

  • 前端Vue自定义得分构成水平柱形图组件 可用于系统专业门类得分评估分析

    引入Vue自定义得分构成水平柱形图组件 cc horBarChart 随着技术的发展 传统的开发方式使得系统的复杂度越来越高 一个小小的改动或小功能的增加可能会导致整体逻辑的修改 造成牵一发而动全身的情况 为了解决这个问题 我们采用了组件化
  • 官方推荐U盘安装Ubuntu 10.10 方法

    通用USB Installer是一个Linux系统安装器 允许你从你的USB闪存驱动器选择安装一个Linux发行版 通用USB安装器使用非常方便 只需选择一个 Linux发行版的ISO文件和你的U盘便能进行安装 Universal USB
  • java用模板生成word(docx)文档(含动态表格)

    生成word思路 用WPS或者office编辑好word的样式 然后另存为word xml文档 将xml翻译为FreeMarker模板 最后用java来解析FreeMarker模板并输出Docx 编辑好需要使用的word文档 1 把需要注入
  • 在Linux上面如何部署jar包?

    1 首先打开工具Xshell或者FinalShell 并登录 2 使用 ll 命令查看根目录文件 确定jar包将要放到哪个位置 使用cd 命令进入文件 如 cd opt yt 3 新建文件传输 可和本地关联 4 将jar包直接拖过去就行 5
  • 树的遍历(中序,前序,后序)

    与只有一种逻辑遍历它们的线性数据结构 数组 链表 队列 堆栈等 不同 树可以以不同的方式遍历 常见的有中序遍历 前序遍历和后序遍历 实现各种遍历的方法又包括 以上图为例 深度优先遍历 a 中序 左 根 右 4 2 5 1 3 b 前序 根
  • 关于async & await(TAP)异步模型的异常捕获

    在TAP之前 若要捕获线程中Task的异常 通常有两种办法 1 阻塞 线程开始后 在适当的时机 调用 wait 或waitAll方法 2 非阻塞 推荐 在建立任务的时候 写该task的continueWith方法 在该方法中捕获异常 对于T
  • get提交和post提交的区别

    Http定义了与服务器交互的不同方法 最基本的方法有4种 分别是GET POST PUT DELETE URL全称是资源描述符 我们可以这样认为 一个URL地址 它用于描述一个网络上的资源 而HTTP中的GET POST PUT DELET
  • Linux安装以及使用

    Linux虚拟机安装以及使用 1 安装VMware16 2 创建虚拟机 3 虚拟机配置网络 4 利用mobaxterm连接服务器 5 配置jdk和tomcat 6 配置docker和mysql 7 部署项目 1 安装VMware16 接下来
  • leetcode160–相交链表(最优解/双指针)

    今天做的三道题比较简单 给你两个单链表的头节点 headA 和 headB 请你找出并返回两个单链表相交的起始节点 如果两个链表不存在相交节点 返回 null 题目数据 保证 整个链式结构中不存在环 注意 函数返回结果后 链表必须 保持其原
  • ISA(MIPS,ARM,RISC-V)中的算术运算溢出检测逻辑是怎样的?

    关于ISA架构 之前写过一些总结 这里单独将其中一个技术点拿出来 对比分析不同架构下实现的差异 这个技术点就是算术指令中的溢出检测 ARM体系结构中 通过CPSR的状态寄存器反映当前指令的溢出状态 而MIPS 则是通过指令触发中断的方式产生
  • Jenkins使用(代码拉取->编译构建->部署上线)

    Jenkins简介 Jenkins是一个开源项目 提供了一种易于使用的持续集成系统 使开发者从繁杂的集成中解脱出来 专注于更重要的业务逻辑实现上 同时Jenkins能实时监控集成中存在的错误 提供详细的日志文件和提醒功能 还能用图表的形式形
  • Java——(1)定义一个学生类Student,包含属性:姓名(String name)、年龄(int age) (2)定义Map集合,用Student对象作为key

    分析以下需求 并用代码实现 1 定义一个学生类Student 包含属性 姓名 String name 年龄 int age 2 定义Map集合 用Student对象作为key 用字符串 此表示表示学生的住址 作为value 3 利用四种方式
  • db2异常

    一 db2 SQL0180N The syntax of the string representation of a datetime value is incorrect SQLSTATE 2200 问题描述 在用import导入时没有
  • qt入门级使用

    qt的安装 可参考 QT下载安装及配置教程 亲测好用 qt基本使用 1 创建第一个qt程序 打开后欢迎界面如下 这是关于qt的一些项目的讲解 不过视频地址在国外 需要翻qiang才能看 而且全是英文 左边还有一个 示例 那里面有各种项目的模
  • Android开发之RecyclerView的使用全解

    转自 http blog csdn net dmk877 article details 50816933 自Android 5 0之后 谷歌公司推出了RecylerView控件 RecylerView 我想看到一个新名词后大部分人会首先发
  • 微分动态规划

    from https en wikipedia org wiki Differential dynamic programming 深入理解DDP DDP是一种轨迹优化类别问题中的最优控制算法 这种算法在1966年被Mayne提出 该算法使
  • PostgreSQL 性能优化

    提出问题 PostgreSQL数据库如何进行简单的性能调优 解决问题 前言 PostgreSQL的配置参数作为性能调优的一部分 起着重要的位置 有时候一个简单的配置参数就会决定应用的性能 因此有必要简单了解下其相关的配置参数 查询Linux
  • Hadoop(三)读写流程

    Remote Procedure Call RPC 远程过程调用协议 它是一种通过网络从远程计算机程序上请求服务 而不需要了解底层网络技术的协议 RPC协议假定某些传输协议的存在 如TCP或UDP 为通信程序之间携带信息数据 在OSI网络通
  • 数据库基础命令

    SELECT 从数据库中提取数据 SELECT column name column name FROM table name SELECT DISTINCT column name column name FROM table name
  • Numpy

    文章目录 1 Numpy是什么 2 ndarray 2 1 什么是ndarray 2 2 ndarray的属性 2 3 ndarray的类型 3 Numpy基本操作 3 1 生成0或1的数组 3 2 从现有数组生成数组 拓展 浅拷贝和深拷贝