一、ravel函數的簡介
在NumPy中,ravel函數的作用是將一個多維數組壓縮成一維數組。這個函數返回一個扁平化之後的一維數組,這個數組會參考原始數組的內存結構,所以它會返回一個指向原數組的數據的視圖。即,它不會創建任何新的數據,只是返回現有數據的一部分。當我們利用ravel函數將一個多維數組轉換成一個一維數組時,它返回的結果只是原始數組的一個複製品。
import numpy as np
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
out1 = arr1.ravel()
print(out1)
# [1 2 3 4 5 6]
arr2 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
out2 = arr2.ravel()
print(out2)
# [1 2 3 4 5 6 7 8]
二、ravel函數與flatten函數的區別
儘管ravel函數和flatten函數都可以將多維數組轉換成一維數組,但是兩者有幾個關鍵的不同點:
1. 返回值引用原始數組
當我們使用ravel函數來展平一個多維數組時,得到的結果是原始數組的一個視圖。而使用flatten函數則會得到原始數組的一個複製品。也就是說,通過ravel函數得到的一維數組與原始數組共享同一塊數據,並且我們能夠通過改變得到的一維數組來改變原始數組的值。
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
ravel_arr = arr.ravel()
flatten_arr = arr.flatten()
ravel_arr[0] = 0
flatten_arr[0] = 0
print(ravel_arr)
# [0 2 3 4 5 6]
print(flatten_arr)
# [0 2 3 4 5 6]
print(arr)
# [[0 2 3]
# [4 5 6]]
2. 速度方面的差異
相比之下,ravel函數更快,因為它避免了為返回新數組而分配新內存的需要。而flatten函數需要創建一個新的數組來保存原始數組的數據。
import time
import numpy as np
arr = np.random.rand(1000, 1000)
start = time.time()
ravel_arr = arr.ravel()
end_ravel = time.time() - start
start = time.time()
flatten_arr = arr.flatten()
end_flatten = time.time() - start
print(f"ravel函數的速度為 {end_ravel:.5f} 秒")
print(f"flatten函數的速度為 {end_flatten:.5f} 秒")
三、ravel函數在數組拷貝時的應用
在機器學習模型中,有一種叫做特徵選擇的方法,其中包含使用相關性或方差來確定哪些特徵可以用來構建模型。在進行特徵選擇時,我們需要將數據與標籤分離開,並將二者存儲在相互分離的數組中。這時,ravel函數也有著重要作用。
import numpy as np
# 獲取特徵數據
x = np.random.rand(100, 2)
# 獲取標籤數據
y = np.random.randint(0, 2, size=100)
# 使用ravel函數將二維特徵數據拍扁成一維
x = x.ravel()
# 此時,我們就可以將特徵數據和標籤數據存儲到不同的numpy數組中
feature_data = np.array([x[:len(x)-1:2], x[1:len(x):2]])
label_data = y
四、ravel函數在多維數組操作中的應用
在矩陣乘法運算中,我們通常會用到dot函數。然而,在進行乘法運算時,需要注意矩陣的形狀。如果我們需要將多個矩陣相乘,這些矩陣需要變成一維數組。這時,ravel函數就有著重要作用。
import numpy as np
arr1 = np.random.rand(2, 3)
arr2 = np.random.rand(3, 2)
arr3 = np.random.rand(2, 2)
result = np.dot(arr1.ravel(), np.dot(arr2.ravel(), arr3.ravel()))
五、結語
總的來說,ravel函數是NumPy中非常有用的一個工具函數,在多維數組操作中和特徵選擇中有著廣泛的運用。需要注意的是,在使用ravel函數時,應該牢記返回值會引用原始數組,這一點很容易被我們忽視。
原創文章,作者:YRBXP,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/372611.html