[英]numpy.ravel giving 2D array - can anyone explain?
我遇到了一些代碼,其中使用 numpy.ravel() 會產生一個二維數組 - 我看過文檔,它說 ravel() 返回一個一維數組(參見https://numpy .org/doc/stable/reference/generated/numpy.ravel.html )。
這是一個顯示這一點的代碼片段:
def jumbo():
import numpy as np
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
matrix = np.zeros((3,3))
matrix.ravel()[:] = my_list
return matrix
new_matrix = jumbo()
print(f"new matrix is:\n{new_matrix}")
我想我要問的部分內容是范圍說明符 [:] 的功能是什么?
ravel
返回 numpy 數組的視圖,因此當你這樣做時:
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
matrix = np.zeros((3,3))
matrix.ravel()[:] = my_list
您正在使用視圖作為暫時將matrix
索引為 1D 的一種方式。
這使得這里可以設置一維列表中的值,但底層數組仍然是二維的。
matrix.ravel()[:]
用於啟用設置數據。 您還可以使用 2 個步驟:
view = matrix.ravel()
view[:] = my_list
輸出:
array([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]])
正如@Stef 在評論中很好地指出的那樣,這個“技巧”只適用於 C-contiguous arrays ,這意味着你不能使用ravel('F')
:
示范:
view1 = matrix.ravel()
view2 = matrix.ravel('F') # actually not a view!
id(matrix)
# 140406991308816
id(view1.base)
# 140406991308816
id(view2.base)
# 9497104 # different id, we have a copy!
您所做的是在“raveled”矩陣中分配值,而實際上沒有保存 ravel 操作。
matrix = np.empty((3,3)) # created empty matrix
matrix.ravel() # created 1d view of matrix
matrix.ravel()[:] # indexing every element of matrix to make assignment possible (matrix is still in (3,3) shape)
matrix.ravel()[:] = my_list # assigned values.
如果你想返回 1D 然后像這樣返回 raveled 數組
def jumbo():
import numpy as np
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
matrix = np.empty((3,3))
matrix.ravel()[:] = my_list
return matrix.ravel()
new_matrix = jumbo()
print(f"new matrix is:\n{new_matrix}")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.