[英]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,))
只要數組的步幅允許它就會得到一個視圖,即使這意味着你並不總是得到一個連續的數組。這是函數的正確命名空間:
這兩個函數都返回指向新內存結構的扁平一維數組。
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
在上面的例子中:
我們如何檢查某些東西是否是副本? 使用.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.