簡體   English   中英

numpy.ravel 給出二維數組 - 誰能解釋一下?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM