Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy中展平函数和拉威尔函数的区别是什么?_Python_Numpy_Multidimensional Array_Flatten_Numpy Ndarray - Fatal编程技术网

Python numpy中展平函数和拉威尔函数的区别是什么?

Python numpy中展平函数和拉威尔函数的区别是什么?,python,numpy,multidimensional-array,flatten,numpy-ndarray,Python,Numpy,Multidimensional Array,Flatten,Numpy Ndarray,两个函数都返回相同的列表。 那么,两个不同的函数执行相同的任务需要什么呢。当前的API是: 总是返回一份副本 尽可能返回原始数组的视图。这在打印输出中不可见,但如果修改ravel返回的数组,它可能会修改原始数组中的条目。如果修改从展平返回的数组中的条目,则永远不会发生这种情况。ravel通常会更快,因为没有复制内存,但在修改它返回的数组时必须更加小心 在数组的步长允许的情况下获取视图,即使这意味着您并不总是获得连续数组 如前所述,关键区别在于: flatte是ndarray对象的一种方法,因

两个函数都返回相同的列表。
那么,两个不同的函数执行相同的任务需要什么呢。

当前的API是:

  • 总是返回一份副本
  • 尽可能返回原始数组的视图。这在打印输出中不可见,但如果修改ravel返回的数组,它可能会修改原始数组中的条目。如果修改从展平返回的数组中的条目,则永远不会发生这种情况。ravel通常会更快,因为没有复制内存,但在修改它返回的数组时必须更加小心
  • 在数组的步长允许的情况下获取视图,即使这意味着您并不总是获得连续数组
如前所述,关键区别在于:

  • flatte
    是ndarray对象的一种方法,因此只能为真正的numpy数组调用

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

例如,
ravel
将在nArray列表上工作,而
flatte
不适用于该类型的对象


@IanH在回答中还指出了内存处理的重要区别。

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

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

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]
在上面的示例中:

  • 结果的存储位置不同
  • 结果看起来是一样的
  • 展平将返回一份副本
  • 拉威尔将返回一个视图
我们如何检查某物是否为副本? 使用
ndarray
.base
属性。如果它是一个视图,则基础将是原始数组;如果是副本,则基础将为
None


检查
a2
是否为
a1

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
输出:


Ravel通常将视图返回到现有数组中(有时返回副本)。展平返回一个新数组。的可能副本是细微差别的实际演示。那么有人能举例说明何时展平一个数组更好,何时展平它吗?谢谢你问这个问题,我也有同样的问题。你知道为什么NumPy开发人员不坚持使用一个带有参数copy=[True,False]的函数吗?Backcompat担保有时会导致类似这种奇怪的事情发生。例如:numpy开发人员最近(在1.10中)添加了一个以前隐含的保证,即ravel将返回一个连续数组(这是编写C扩展时非常重要的一个属性),因此现在API是
a.flatte()
为了确保获得副本,
a.ravel()
避免大多数副本,但仍然保证返回的数组是连续的,
a.reformate(-1,)
以便在数组的步长允许的情况下真正获得视图,即使这意味着并不总是获得连续数组。@Hossein IanH解释道:
ravel
保证了连续数组,因此不能保证它返回一个视图<代码>重塑总是返回一个视图,因此不能保证它返回一个连续数组。@Hossein这将是一个全新的问题。非常简单地说,读取和写入连续内存空间的速度要快得多。这里有几个问题和答案,如果您还有其他问题,请随意打开一个新的。为什么它被称为
ravel
?这个名字背后的想法是什么?关于ravel()处理
ndarray
列表的信息,请点击这里。不仅仅是数组列表,还有列表列表:)
id(a1.base)
应该与
id(a2.base)
import numpy
a1 = numpy.array([[1,2],[3,4]])
a2 = a1.copy()
id(a2.base), id(a1.base)
(140735713795296, 140735713795296)