在numpy中扁平函数和ravel函数有什么区别?

2024-10-01 02:19:18 发布

您现在位置:Python中文网/ 问答频道 /正文

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]

两个函数都返回相同的列表。 那么,两个不同的职能部门执行同一项工作的需要是什么呢。


Tags: 函数importnumpy列表outputasnparray
3条回答

以下是函数的正确命名空间:

这两个函数都返回指向新内存结构的扁平1D数组。

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

在上面的示例中:

  • 结果的存储位置不同
  • 结果看起来一样
  • 扁平化将返回一个副本
  • 拉威尔会回头看。

我们怎么检查东西是不是复制品? 使用ndarray.base属性。如果是视图,基将是原始数组;如果是副本,基将是None

正如here所解释的,关键区别在于:

  • flatten是ndarray对象的方法,因此只能对真正的numpy数组调用。

  • ravel是库级函数,因此可以对任何可以成功解析的对象调用。

例如,ravel将处理nDarray列表,而flatten不可用于该类型的对象。

@IanH在回答中也指出了与记忆处理的重要区别。

当前的API是:

  • ^{}总是返回一个副本。
  • ^{}尽可能返回原始数组的视图。这在打印输出中不可见,但是如果修改ravel返回的数组,它可能会修改原始数组中的条目。如果修改flatten返回的数组中的条目,则永远不会发生这种情况。ravel通常会更快,因为没有复制内存,但是在修改它返回的数组时必须更加小心。
  • ^{}在数组的跨步允许时获取视图,即使这意味着您并不总是获得一个连续的数组。

相关问题 更多 >