【NumPy 数组副本 vs 视图、NumPy 数组形状、重塑、迭代】

news2025/1/6 20:12:06

在这里插入图片描述

🤵‍♂️ 个人主页@老虎也淘气 个人主页
✍🏻作者简介:Python学习者
🐋 希望大家多多支持我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注

python之numpy学习

  • NumPy 数组副本 vs 视图
    • 副本和视图之间的区别
    • 副本
    • 视图:
    • 检查数组是否拥有数据
  • NumPy 数组形状
    • 获取数组的形状
    • 元组的形状代表什么?
  • NumPy 数组重塑
    • 从 1-D 重塑为 2-D
    • 我们可以重塑成任何形状吗?
    • 返回副本还是视图?
    • 未知的维
    • 展平数组
  • NumPy数组迭代
    • 迭代 2-D 数组
    • 迭代 3-D 数组
    • 使用 nditer() 迭代数组
    • 迭代不同数据类型的数组
    • 以不同的步长迭代
    • 使用 ndenumerate() 进行枚举迭代

NumPy 数组副本 vs 视图

副本和视图之间的区别

副本和数组视图之间的主要区别在于副本是一个新数组,而这个视图只是原始数组的视图。

副本拥有数据,对副本所做的任何更改都不会影响原始数组,对原始数组所做的任何更改也不会影响副本。

视图不拥有数据,对视图所做的任何更改都会影响原始数组,而对原始数组所做的任何更改都会影响视图。

副本

实例:
进行复制,更改原始数组并显示两个数组:

import numpy as np

arr = np.array([1, 2, 3, 4, 5])
x = arr.copy()
arr[0] = 61

print(arr) 
print(x)

该副本不应受到对原始数组所做更改的影响。

视图:

实例
创建视图,更改原始数组,然后显示两个数组:

import numpy as np

arr = np.array([1, 2, 3, 4, 5])
x = arr.view()
arr[0] = 61

print(arr) 
print(x)

视图应该受到对原始数组所做更改的影响。

在视图中进行更改:

实例
创建视图,更改视图,并显示两个数组:

import numpy as np

arr = np.array([1, 2, 3, 4, 5])
x = arr.view()
x[0] = 31

print(arr) 
print(x)

原始数组应该受到对视图所做更改的影响。

检查数组是否拥有数据

如上所述,副本拥有数据,而视图不拥有数据,但是我们如何检查呢?

每个 NumPy 数组都有一个属性 base,如果该数组拥有数据,则这个 base 属性返回 None。

否则,base 属性将引用原始对象。

实例
打印 base 属性的值以检查数组是否拥有自己的数据:

import numpy as np

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

x = arr.copy()
y = arr.view()

print(x.base)
print(y.base)

副本返回 None。

视图返回原始数组。

NumPy 数组形状

数组的形状是每个维中元素的数量。

获取数组的形状

NumPy 数组有一个名为 shape 的属性,该属性返回一个元组,每个索引具有相应元素的数量。

实例
打印 2-D 数组的形状:

import numpy as np

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

print(arr.shape)

上面的例子返回 (2, 4),这意味着该数组有 2 个维,每个维有 4 个元素。

实例
利用 ndmin 使用值 1,2,3,4 的向量创建有 5 个维度的数组,并验证最后一个维度的值为 4:

import numpy as np

arr = np.array([1, 2, 3, 4], ndmin=5)

print(arr)
print('shape of array :', arr.shape)

元组的形状代表什么?

每个索引处的整数表明相应维度拥有的元素数量。

上例中的索引 4,我们的值为 4,因此可以说第 5 个 ( 4 + 1 th) 维度有 4 个元素。

NumPy 数组重塑

重塑意味着更改数组的形状。

数组的形状是每个维中元素的数量。

通过重塑,我们可以添加或删除维度或更改每个维度中的元素数量。

从 1-D 重塑为 2-D

实例
将以下具有 12 个元素的 1-D 数组转换为 2-D 数组。

最外面的维度将有 4 个数组,每个数组包含 3 个元素:

import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])

newarr = arr.reshape(4, 3)

print(newarr)

从 1-D 重塑为 3-D
实例
将以下具有 12 个元素的 1-D 数组转换为 3-D 数组。

最外面的维度将具有 2 个数组,其中包含 3 个数组,每个数组包含 2 个元素:

import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])

newarr = arr.reshape(2, 3, 2)

print(newarr)

我们可以重塑成任何形状吗?

是的,只要重塑所需的元素在两种形状中均相等。

我们可以将 8 元素 1D 数组重塑为 2 行 2D 数组中的 4 个元素,但是我们不能将其重塑为 3 元素 3 行 2D 数组,因为这将需要 3x3 = 9 个元素。

实例
尝试将具有 8 个元素的 1D 数组转换为每个维度中具有 3 个元素的 2D 数组(将产生错误):

import numpy as np

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

newarr = arr.reshape(3, 3)

print(newarr)

返回副本还是视图?

实例
检查返回的数组是副本还是视图:

import numpy as np

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

print(arr.reshape(2, 4).base)

上面的例子返回原始数组,因此它是一个视图。

未知的维

您可以使用一个“未知”维度。

这意味着您不必在 reshape 方法中为维度之一指定确切的数字。

传递 -1 作为值,NumPy 将为您计算该数字。

实例
将 8 个元素的 1D 数组转换为 2x2 元素的 3D 数组:

import numpy as np

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

newarr = arr.reshape(2, 2, -1)

print(newarr)

注释:我们不能将 -1 传递给一个以上的维度。

展平数组

展平数组(Flattening the arrays)是指将多维数组转换为 1D 数组。

我们可以使用 reshape(-1) 来做到这一点。

实例
把数组转换为 1D 数组:

import numpy as np

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

newarr = arr.reshape(-1)

print(newarr)

注释:有很多功能可以更改 numpy flatten、ravel 中数组形状,还可以重新排列元素 rot90、flip、fliplr、flipud 等。这些功能属于 numpy 的中级至高级部分。

NumPy数组迭代

迭代意味着逐一遍历元素。

当我们在 numpy 中处理多维数组时,可以使用 python 的基本 for 循环来完成此操作。

如果我们对 1-D 数组进行迭代,它将逐一遍历每个元素。

实例
迭代以下一维数组的元素:

import numpy as np

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

for x in arr:
  print(x)

迭代 2-D 数组

在 2-D 数组中,它将遍历所有行。

实例
迭代以下二维数组的元素:

import numpy as np

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

for x in arr:
  print(x)

如果我们迭代一个 n-D 数组,它将逐一遍历第 n-1 维。

如需返回实际值、标量,我们必须迭代每个维中的数组。

实例
迭代 2-D 数组的每个标量元素:

import numpy as np

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

for x in arr:
  for y in x:
    print(y)

迭代 3-D 数组

在 3-D 数组中,它将遍历所有 2-D 数组。

实例
迭代以下 3-D 数组的元素:

import numpy as np

arr = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])

for x in arr:
  print(x)

要返回实际值、标量,我们必须迭代每个维中的数组。

实例
迭代到标量:

import numpy as np

arr = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])

for x in arr:
  for y in x:
    for z in y:
      print(z)

使用 nditer() 迭代数组

函数 nditer() 是一个辅助函数,从非常基本的迭代到非常高级的迭代都可以使用。它解决了我们在迭代中面临的一些基本问题,让我们通过例子进行介绍。

迭代每个标量元素
在基本的 for 循环中,迭代遍历数组的每个标量,我们需要使用 n 个 for 循环,对于具有高维数的数组可能很难编写。

实例
遍历以下 3-D 数组:

import numpy as np

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

for x in np.nditer(arr):
  print(x)

迭代不同数据类型的数组

我们可以使用 op_dtypes 参数,并传递期望的数据类型,以在迭代时更改元素的数据类型。

NumPy 不会就地更改元素的数据类型(元素位于数组中),因此它需要一些其他空间来执行此操作,该额外空间称为 buffer,为了在 nditer() 中启用它,我们传参 flags=[‘buffered’]。

实例
以字符串形式遍历数组:

import numpy as np

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

for x in np.nditer(arr, flags=['buffered'], op_dtypes=['S']):
  print(x)

以不同的步长迭代

我们可以使用过滤,然后进行迭代。

实例
每遍历 2D 数组的一个标量元素,跳过 1 个元素:

import numpy as np

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

for x in np.nditer(arr[:, ::2]):
  print(x)

使用 ndenumerate() 进行枚举迭代

枚举是指逐一提及事物的序号。

有时,我们在迭代时需要元素的相应索引,对于这些用例,可以使用 ndenumerate() 方法。

实例
枚举以下 1D 数组元素:

import numpy as np

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

for idx, x in np.ndenumerate(arr):
  print(idx, x)

实例
枚举以下 2D 数组元素:

import numpy as np

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

for idx, x in np.ndenumerate(arr):
  print(idx, x)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/80316.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实验五 进程通信-管道通信

1. 函数int pipe(int fd[2])创建一个管道,管道两端可分别用描述字fd[0]以及fd[1]来描述。需要注意的是,管道的两端是固定了任务的。即一端只能用于读,由描述字fd[0]表示,称其为管道读端;另一端则只能用于写&#xff0c…

我失业了?| ChatGPT生信分析初体验

最近ChatGPT火的一塌糊涂,作为在生物医学和计算机科学领域夹缝求生的边缘摇摆人,也来蹭一波热度。ChatGPT是一个预训练的语言模型,由OpenAI训练。它可以用来生成自然语言文本,并且可以进行对话。它基于Transformer架构&#xff0c…

OAuth2.0的四种授权方式

前言 OAuth 简单理解就是一种授权机制,它是在客户端和资源所有者之间的授权层,用来分离两种不同的角色。在资源所有者同意并向客户端颁发令牌后,客户端携带令牌可以访问资源所有者的资源。 OAuth2.0 是 OAuth 协议的一个版本,有…

【计算机毕业设计】77.旅游资源网站源码

一、系统截图(需要演示视频可以私聊) 摘 要 本论文主要论述了如何使用JAVA语言开发一个旅游资源网站 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中&#xf…

MATLB|分布式能源的选址与定容IEEE30节点实现

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清…

Jmeter(四):请求默认值元件应用,模拟http请求实战,正则表达式提取器元件讲解

Jmeter(7):jmeter请求默认值元件应用 HTTP请求默认值 在公司内部进行测试的时候,一般测试环境访问的接口地址(服务器名称 或IP)、端口、协议一般都是不变的,但http请求取样器每个请求都要求写一遍 这些信息&#xff0…

购物网站系统

视频如下 go网站前台:关于我们、联系我们、公告信息、商品类型、商品信息、商品评论管理员: 1、管理关于我们、联系我们 2、增删改查公告类型、公告信息 3增删改查商品类型、商品信息 4、查看注册用户信息 5、查看用户充值信息 6、查看回复用户咨询 7、查看下单信息 8、发货、查…

微信支付API3 APP【统一下单 APIV3】

官方参考资料 签名:签名生成-接口规则 | 微信支付商户平台文档中心 签名生成:签名生成 - WechatPay-API-v3 统一下单接口:微信支付-开发者文档 如何查看证书序列号:证书相关 - WechatPay-API-v3 私钥和证书:私钥和…

EXCEL基础:数据透视表(按年龄分组统计与统计各部门的工资情况)

【按年龄分组进行统计】: 如下为原始数据,最后就是年龄字段: 选择数据单元格,在新表里插入【数据透视表】,若数据透视表的【字段列表】没有显示,可以按照1标注那里勾选, 按照2处的列、行和统计…

Pytorch:使用官网提供数据集的相关参数设置,以CIFAR10为例进行说明

文章目录前言一、Dataset定义-组成分类二、获取数据集1.参数说明2.相关Demo前言 本文记录笔者关于Dataset的相关学习记录,以Pytorch官网文档为主进行学习 一、Dataset 定义-组成 所谓Dataset,指的是我们在学习神经网络中要接触的数据集,一…

[附源码]Python计算机毕业设计SSM基于的楼盘销售系统的设计与实现(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

关于近期虚拟化学习遇到的问题总结

一、关于Intel VT-x/EPT. 不使用虚拟化的Intel VT-x/EPT 因为需要在Linux中使用kvm做虚拟化因此需要开放宿主虚拟机的虚拟权限 但是打开报错 首先想要开启虚拟化,你的cpu是一定要支持虚拟化的 如何查看呢,可以ctrlaltdel打开任务管理器 点击性能 可以看…

电子加速器原理与应用

辐射单位 射线能量ϵ\epsilonϵ,单位eVeVeV ϵhν\epsilon h\nuϵhν,普朗克常数hhh,电磁波频率ν\nuν 电子伏特eVeVeV:一个电子(电量为1.610C)经过1VVV的电位差加速后获得的动能。 1eV1.610−19J1.610−…

计及碳捕集电厂低碳特性的含风电电力系统源–荷多时间尺度调度方法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

[附源码]Python计算机毕业设计SSM基于的楼盘销售管理系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Java基本微信小程序的适老化老人健康预警系统 springboot+vue

随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&#xf…

LinkedList(Java8)个人理解

问题:LinkedList 的 Node 怎么理解? Node 是 LinkedList 的私有静态内部类,作为链表结构的基本元素,可以看作是链条上的一个节(结)点。一个 node 对象中除了存储元素的值外,还存储着前一个 nod…

【软件测试】测试员vs测试工程师,你是测试员还是测试工程师?

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 不是什么时候&#…

[Java] 序列化(Serialization)的本质是什么?在Java中怎么实现?为什么要了解序列化技术?序列化技术选型要点是什么?

文章目录前言序列化是什么?理解对象在内存中是如何存储的数据在进程内存中的分布图数据被序列化之后在内存中的分布图序列化/反序列化的本质?序列化在Java中的实现?1. JDK Serialization(不推荐使用)2. 第三方实现&…

本地完成Vue脚手架和Django建立连接

目录 在Vue中 setting.py中: urls.py中 首先把要连接的Django项目和Vue脚手架创建好 之后我们把整个Vue拖到Django的文件夹根目录下,于manage.py同级即可(图中data-work为我的Vue) 在Vue中 进入到vue.config.js文件夹下 添加as…