numpy 中的 flatten 和 ravel 函数有什么区别?
- 2025-01-17 09:23:00
- admin 原创
- 93
问题描述:
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]
两个函数都返回相同的列表。那么为什么需要两个不同的函数来执行相同的工作呢?
解决方案 1:
当前的 API 是:
flatten
总是返回一份副本。ravel
尽可能返回原始数组的连续视图。这在打印输出中不可见,但如果您修改 ravel 返回的数组,它可能会修改原始数组中的条目。如果您修改 flatten 返回的数组中的条目,则永远不会发生这种情况。ravel 通常会更快,因为没有复制内存,但您必须更加小心地修改它返回的数组。reshape((-1,))
只要数组的步幅允许,就会获取一个视图,即使这意味着您并不总是能获得一个连续的数组。
解决方案 2:
正如这里所解释的,一个主要的区别是:
flatten
是 ndarray 对象的一种方法,因此只能对真正的 numpy 数组调用。ravel
是一个库级函数,因此可以在任何能够成功解析的对象上调用。
例如ravel
将对 ndarrays 列表起作用,但flatten
不适用于该类型的对象。
@IanH 在他的回答中也指出了内存处理的重要区别。
解决方案 3:
以下是函数的正确命名空间:
numpy.ndarray.flatten
numpy.ravel
两个函数都返回指向新内存结构的扁平化一维数组。
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("
base r:", r.base)
print("
base 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)
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD