簡體   English   中英

扁平和拉威爾之間的差異()

[英]numpy difference between flat and ravel()

以下有什么區別?

>>> import numpy as np
>>> arr = np.array([[[  0,   1,   2],
...                  [ 10,  12,  13]],
...                 [[100, 101, 102],
...                  [110, 112, 113]]])
>>> arr
array([[[  0,   1,   2],
        [ 10,  12,  13]],
       [[100, 101, 102],
        [110, 112, 113]]])
>>> arr.ravel()
array([  0,   1,   2,  10,  12,  13, 100, 101, 102, 110, 112, 113])
>>> arr.ravel()[0] = -1
>>> arr
array([[[ -1,   1,   2],
        [ 10,  12,  13]],
       [[100, 101, 102],
        [110, 112, 113]]])
>>> list(arr.flat)
[-1, 1, 2, 10, 12, 13, 100, 101, 102, 110, 112, 113]
>>> arr.flat[0] = 99
>>> arr
array([[[ 99,   1,   2],
        [ 10,  12,  13]],
       [[100, 101, 102],
        [110, 112, 113]]])

除了flat返回迭代器而不是列表這一事實之外,它們看起來是相同的,因為它們都會改變原始數組(這與flatten()相反,后者返回數組的副本)。 那么, flatravel()之間還有其他顯着的區別嗎? 如果沒有,何時使用一個而不是另一個是有用的?

flat是一個迭代器。 它是一個單獨的對象,恰好通過索引來訪問數組元素。 它的主要目的是在循環和理解表達式中使用。 它給出的順序與你通常從ravel得到的順序相同。

不同的結果ravelflat不是ndarray ,所以它不能做太多,除了索引數組並遍歷它。 請注意,您必須調用list才能查看迭代器的內容。 例如, arr.flat.min()將失敗並出現AttributeError ,而arr.ravel().min()將給出與arr.min()相同的結果。

由於numpy提供了許多不需要顯式循環的操作,因此與ndarray.ravel()相比,很少使用ndarray.flat和迭代器。

話雖這么說,有些情況下迭代器更可取。 如果你的數組足夠大並且你試圖逐個檢查所有元素,那么迭代器就可以正常工作。 如果您有像內存映射數組一樣的部分加載,則尤其如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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