簡體   English   中英

numpy 中的 flatten 和 ravel 函數有什么區別?

[英]What is the difference between flatten and ravel functions in numpy?

import numpy as np
y = np.array(((1,2,3),(4,5,6),(7,8,9)))
OUTPUT:
print(y.flatten())
[1   2   3   4   5   6   7   8   9]
print(y.ravel())
[1   2   3   4   5   6   7   8   9]

兩個函數都返回相同的列表。 那么需要兩個不同的功能來執行相同的工作。

當前的API是:

  • flatten總是返回一個副本。
  • ravel盡可能返回原始數組的視圖。 這在打印輸出中不可見,但如果您修改 ravel 返回的數組,它可能會修改原始數組中的條目。 如果您修改從 flatten 返回的數組中的條目,這將永遠不會發生。 ravel 通常會更快,因為沒有內存被復制,但你必須更加小心修改它返回的數組。
  • reshape((-1,))只要數組的步幅允許它就會得到一個視圖,即使這意味着你並不總是得到一個連續的數組。

正如這里所解釋的一個關鍵的區別是:

  • flatten是 ndarray 對象的一種方法,因此只能為真正的 numpy 數組調用。

  • ravel是一個庫級函數,因此可以在任何可以成功解析的對象上調用。

例如ravel將處理 ndarrays 列表,而flatten不適用於該類型的對象。

@IanH 在他的回答中還指出了與內存處理的重要區別。

這是函數的正確命名空間:

這兩個函數都返回指向新內存結構的扁平一維數組。

import numpy
a = numpy.array([[1,2],[3,4]])

r = numpy.ravel(a)
f = numpy.ndarray.flatten(a)  

print(id(a))
print(id(r))
print(id(f))

print(r)
print(f)

print("\nbase r:", r.base)
print("\nbase f:", f.base)

---returns---
140541099429760
140541099471056
140541099473216

[1 2 3 4]
[1 2 3 4]

base r: [[1 2]
 [3 4]]

base f: None

在上面的例子中:

  • 結果的內存位置不同,
  • 結果看起來一樣
  • flatten 會返回一個副本
  • ravel 會返回一個視圖。

我們如何檢查某些東西是否是副本? 使用.base的屬性ndarray 如果是視圖,則基數將是原始數組; 如果是副本,則基數將為None


檢查a2是否是a1副本

import numpy
a1 = numpy.array([[1,2],[3,4]])
a2 = a1.copy()
id(a2.base), id(a1.base)

出去:

(140735713795296, 140735713795296)

暫無
暫無

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

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