首页 > 编程语言 > 详细

二、Python开发---32、numpy(7)

时间:2020-03-01 09:33:03      阅读:66      评论:0      收藏:0      [点我收藏+]

副本与视图

  在执行函数时,其中一些返回输入数组的副本,而另一些返回视图;当物理存储在另一位置时,称为副本,另一方面,如果提供了相同内存内容的,则将其称为视图

  无复制,简单的赋值不会创建对象的副本,相反,它使用原始数组的相同id()来访问它;id()返回python对象的内存地址,类似于C中的指针

import numpy as np
arr = np.arange(6)
print(arr)                          #输出为 [0 1 2 3 4 5]
print(id(arr))                      #输出为 2819351031120
brr = arr
#brr的id与arr的相同
print(id(brr))                      #输出为 2819351031120
#修改brr的形状arr的也会随之改变
brr.shape = (2,3)
print(brr)                          #输出为 [[0 1 2]
                                    #       [3 4 5]]
print(arr)                          #输出为 [[0 1 2]
                                    #       [3 4 5]]

  视图或浅复制
  numpy拥有ndarray.view()方法,它是一个新的数组对象,并且有与原始数据相同的数据,与前一种情况不同,新数组的位数更改不会影响原始数据的维数,数组的切片也会创建视图,但内容的改变,会影响原始数据,它们的物理内存不一样

import numpy as np
arr = np.arange(6).reshape(2,3)
print(arr)                          #输出为 [[0 1 2]
                                    #       [3 4 5]]
print(id(arr))                      #输出为 1947690446400
#创建arr的视图brr,brr = arr.view()
brr = arr.view()
#brr的id与arr的不相同
print(brr)                          #输出为 [[0 1 2]
                                    #       [3 4 5]]
print(id(brr))                      #输出为 1947693302368
#修改brr的形状arr的不会改变,但是更改brr里面的值arr的也会改变
brr.shape = (1,6)
brr[0,0] = 10
print(brr)                          #输出为 [[10  1  2  3  4  5]]
print(arr)                          #输出为 [[10  1  2]
                                    #       [ 3  4  5]]

  副本深复制
  ndarray.copy()函数创建一个深层副本, 它是数组及其数据的完整副本,不与原始数组共享,物理内存独立,数据修改也不影响原数据

import numpy as np
arr = np.array([[4,5,6],[7,8,9]])
print(arr)                              #输出为 [[4 5 6]
                                        #       [7 8 9]]
#查看原数组的ID
print(id(arr))                          #输出为 2195164605776
#创建arr的副本,brr = arr.copy()
brr = arr.copy()
#brr的id与arr的不相同
print(brr)                              #输出为 [[4 5 6]
                                        #       [7 8 9]]
print(id(brr))                          #输出为 2195166379824
#修改brr的值arr的不会改变
brr[0,0] = 10
print(brr)                              #输出为 [[10  5  6]
                                        #       [ 7  8  9]]
print(arr)                              #输出为 [[4 5 6]
                                        #       [7 8 9]]

 

二、Python开发---32、numpy(7)

原文:https://www.cnblogs.com/lanzhijie/p/12387477.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!