【Python学习】 - 关于函数返回拷贝还是返回视图的几组函数汇总
生活随笔
收集整理的這篇文章主要介紹了
【Python学习】 - 关于函数返回拷贝还是返回视图的几组函数汇总
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.np.flatten() 和 np.ravel()
兩者的功能是一致的,將多維數組降為一維,但是兩者的區別是返回拷貝還是返回視圖。
np.flatten()返回一份拷貝,對拷貝所做修改不會影響原始矩陣,而np.ravel()返回的是視圖,修改時會影響原始矩陣
使用時推薦np.flatten()
輸入:import numpy as np a = np.array([[1 , 2] , [3 , 4]]) b = a.flatten() print('b:' , b) c = a.ravel() print('c:' , c) d = a.ravel('F') print('d:' , d)# 二者的區別 b[0] = 10 print('a:' , a) c[0] = 10 print('a:' , a)輸出:b: [1 2 3 4] c: [1 2 3 4] d: [1 3 2 4] a: [[1 2] [3 4]] a: [[10 2] [ 3 4]]?
2.np.array()與np.asarray的區別
其在于輸入為數組時,np.array是將重新創建一個數組空間并將數據復制進去,它有自己的一塊內存區域,所以隨著輸入的改變np.array的輸出不變(即返回拷貝);而np.asarray功能是將指向數組a的計數器加1,并指向該數組,這樣當原始數組改變的時候,np.asarray的輸出也會改變(相當于返回視圖)。
推薦使用np.array()
輸入:import numpy as npa=np.ones((3,3)) b=np.array(a) c=np.asarray(a) a[1]=2print('a:\n',a) print('b:\n',b) print('c:\n',c) print(b is a) # False print(c is a) # True輸出:a:[[1. 1. 1.][2. 2. 2.][1. 1. 1.]] b:[[1. 1. 1.][1. 1. 1.][1. 1. 1.]] c:[[1. 1. 1.][2. 2. 2.][1. 1. 1.]] False True但是其實如果是這么寫的話,兩者又是等價的:(因為改變了類型,所以都只能返回一個拷貝)
輸入:a=np.ones((3,3)) b=np.array(a,dtype = 'float32') c=np.asarray(a,dtype = 'float32') a[1]=2print('a:\n',a) print('b:\n',b) print('c:\n',c) print(b is a) # False print(c is a) # True輸出:a:[[1. 1. 1.][2. 2. 2.][1. 1. 1.]] b:[[1. 1. 1.][1. 1. 1.][1. 1. 1.]] c:[[1. 1. 1.][1. 1. 1.][1. 1. 1.]] False False?
總結
以上是生活随笔為你收集整理的【Python学习】 - 关于函数返回拷贝还是返回视图的几组函数汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 招行信用卡循环利息是什么 招行信用卡循环
- 下一篇: 【基于Python】 - 人工智能机器学