首页 > 其他分享 >20. NumPy副本和视图

20. NumPy副本和视图

时间:2022-09-28 10:24:46浏览次数:58  
标签:arr 20 19 视图 ID 数组 print NumPy id

1. 前言

对 NumPy 数组执行些函数操作时,其中一部分函数会返回数组的副本,而另一部分函数则返回数组的视图。本节对数组的副本和视图做重点讲解。

其实从内存角度来说,副本就是对原数组进行深拷贝,新产生的副本与原数组具有不同的存储位置。而视图可理解为对数组的引用,它和原数组有着相同的内存位置。

2. 赋值操作

赋值操作是数组引用的一种方法。比如,将 a 数组赋值给变量 b,被赋值后的变量 b 与 a 组具有相同的内存 id。因此,无论操作 a、b 中哪个数组,另一个数组也会受到影响。例如下:

import numpy as np 
a = np.array([[1,2,3,4],[9,0,2,3],[1,2,3,19]]) 
print("原数组",a) 
print("a数组的ID:",id(a)) 
b = a
print("数组b的id:",id(b)) 
b.shape = 4,3; 
print("b数组形状的更改也会反映到a数组上:") 
print(a)  

输出结果:

原数组:
[[1 2 3 4]
[9 0 2 3]
[1 2 3 19]]

数组a的ID:139663602288640
b数组的ID:139663602288640

b数组形状的更改也会反映给a数组上:
[[ 1 2 3]
[4 9 0]
[2 3 1]
[2 3 19]]

3. ndarray.view()

ndarray.view() 返回一个新生成的数组副本,因此对该数组的操作,不会影响到原数组。下面看一组示例:

import numpy as np 
a = np.array([[1,2,3,4],[9,0,2,3],[1,2,3,19]]) 
print("原数组",a) 
print("数组a的ID:",id(a)) 
b = a.view() 
print("数组b的ID:",id(b)) 
#打印b数组
print(b) 
#改变b数组形状
b.shape = 4,3
print("原数组a",a) 
print("新数组b",b) 

输出结果:

原数组:
[[ 1  2  3  4]
[ 9  0  2  3]
[ 1  2  3 19]]

a数组id: 140280414447456
b数组id: 140280287000656

打印b数组
[[ 1  2  3  4]
[ 9  0  2  3]
[ 1  2  3 19]]

对数组b所做的更改不会反映到a数组上:

原a数组
[[ 1  2  3  4]
[ 9  0  2  3]
[ 1  2  3 19]]

新数组b
[[ 1  2  3]
[ 4  9  0]
[ 2  3  1]
[ 2  3 19]]

4. 切片创建视图

使用切片可以创建视图数组,若要修改视图的就会影响到原数组,示例如下:

import numpy as np
arr = np.arange(10)
print ('数组arr:')
print (arr)
#创建切片修改原数组arr
a=arr[3:]
b=arr[3:]
a[1]=123
b[2]=234
print(arr)

输出结果:

arr数组:
[ 0 1 2 3 4 5 6 7 8 9]
切片修改arr原数组:
[ 0 1 2 3 123 234 6 7 8 9]

5. ndarray.copy()

该方法返回原数组的副本,对副本的修改不会影响到原数组。示例如下:

import numpy as np 
a = np.array([[1,2,3,4],[9,0,2,3],[1,2,3,19]]) 
print("原数组",a) 
print("a数组ID:",id(a)) 
b = a.copy() 
print("b数组ID:",id(b)) 
print("打印经过copy方法的b数组:") 
print(b) 
b.shape=4,3
print("原数组",a) 
print("经过copy方法的b数组",b) 

输出结果:

原始数组:
[[ 1  2  3  4]
[ 9  0  2  3]
[ 1  2  3 19]]

a数组ID: 139895697586176
b数组ID: 139895570139296

打印经过copy方法的b数组
[[ 1  2  3  4]
[ 9  0  2  3]
[ 1  2  3 19]]

对b数组的改变不会影响到a数组:

原数组
[[ 1  2  3  4]
[ 9  0  2  3]
[ 1  2  3 19]]

经过Copy方法的b数组
[[ 1  2  3]
[ 4  9  0]
[ 2  3  1]
[ 2  3 19]]

 

标签:arr,20,19,视图,ID,数组,print,NumPy,id
From: https://www.cnblogs.com/jiajunling/p/16737067.html

相关文章

  • P1600 [NOIP2016 提高组] 天天爱跑步
    P1600NOIP2016提高组天天爱跑步LCA+桶点击查看代码///*考虑上行的情况(u,v)中u被i看到<=>1.u∈{i的子树} 2.lca(u,v)不属于{i的子树} 3.de......
  • P3238 [HNOI2014]道路堵塞
    P3238HNOI2014道路堵塞点击查看代码#include<iostream>#include<stdio.h>#include<string.h>#include<algorithm>#include<utility>#include<array>#incl......
  • BUUCTF web 第一题[极客大挑战 2019]EasySQL
    BUUCTFweb第一题sql注入之万能密码[极客大挑战2019]EasySQL✔解题方法1.判断类型为:有回显、字符型sql注入当输入343、343)、343’‘、343’‘)当输入343‘时当......
  • [CSP-S2019] Emiya 家今天的饭
    P5664CSP-S2019Emiya家今天的饭容斥原理+DP答案=没有限制3的答案-∑某一列不满足性质3的答案,记号:行表示方案,纵表示食材第2类:不满足性质3的只有一种列(必须>k/2......
  • P3638 [APIO2013] 机器人
    P3638APIO2013机器人区间DP+最短路处理环形DP设f[l][r][i]表示合并出编号为[l..r]的机器人(在i号格子)的最少步数转移:1.合并机器人2.用最短路转移:使用两个队列模......
  • serialportscreeen-2022-09-27
    1、继续单元格反色问题,因为大的表格包含许多小的单元格,因此在工程中通过一个反色单元格占用一个背景图片,然后在变量数据录入过程选择好页面切换,如果所需表格很多,就需要考虑......
  • 2022年09月22日11:43:20
    1、rviz-d[文件名]使用指定的配置文件打开rviz-d/home/ubuntu/work/bkth/ros_ws/src/RFans_Rviz_cfg.rviz2、rviz-f【frame名】接收指定的framerviz-fworld......
  • Jenkins 20220927笔记本4
                          ......
  • Windows10系统SQL SERVER 2008 R2 安装失败
    Win10系统没有问题,SQLSERVER2008R2安装文件也没有问题,但就是安装失败。原因:SQLSERVER2008R2最低只支持4k分区,原理跟其页面分配设计有关。Win10+新固态支持使用更......
  • 互联网摸鱼日报(2022-09-28)
    互联网摸鱼日报(2022-09-28)InfoQ热门话题靠谱CTO必须是技术高手?前Facebook总监:技术越好,bug越少TDSQL破局敏态业务背后的技术演进|DBTalk技术公开课第3期在敏......