已知

时间:2015-10-14 05:00:01

标签: numpy

看到这个answer我想知道X的平面视图的创建是否基本相同,只要我知道X中的轴数是3:

A = X.ravel()

s0, s1, s2 = X.shape
B = X.reshape(s0*s1*s2)

C = X.reshape(-1)  # thanks to @hpaulj below

我不是在问A和B和C是否相同。

我想知道在这种情况下{em}的ravelreshape的具体用法是否基本相同,或者是否存在明显的差异,优点或缺点,前提是你提前知道X的轴数。

第二种方法需要几微秒,但这似乎与尺寸无关。

1 个答案:

答案 0 :(得分:6)

查看他们的__array_interface__并做一些时间安排。我能看到的唯一区别是ravel更快。

.flatten()有一个更显着的区别 - 它会返回一个副本。

A.reshape(-1)

是一种使用重塑的简单方法。

您可以学习相应的文档,看看是否还有其他内容。我没有探究指定order时会发生什么。

如果我只想要它是1d,我会使用ravel。我最常使用.reshape将1d(例如arange())更改为nd。

e.g。

np.arange(10).reshape(2,5).ravel()

或选择使您的代码最具可读性的那个。

{p> reshaperavelnumpy C代码中定义:

https://github.com/numpy/numpy/blob/0703f55f4db7a87c5a9e02d5165309994b9b13fd/numpy/core/src/multiarray/shape.c

PyArray_Ravel(PyArrayObject *arr, NPY_ORDER order)需要近100行C代码。如果订单发生变化,它会向PyArray_Flatten支付。

在同一个文件中,reshapenewshape投放。这反过来返回view,形状实际上没有变化,尝试_attempt_nocopy_reshape,并且最后的手段返回PyArray_NewCopy

两者都使用PyArray_NewshapePyArray_NewFromDescr - 取决于形状和顺序的混合和匹配方式。

因此,需要仔细研究,确定重塑(至1d)和混淆不同的地方。

执行此ravel的另一种方法是创建一个具有新形状但具有相同数据缓冲区的新数组:

np.ndarray((24,),buffer=A.data)

它与reshape相同。它的__array_interface__是一样的。我不建议使用这种方法,但它可以澄清这些重塑/拉威尔功能发生了什么。他们都创建了一个新的数组,具有新的形状,但有共享数据(如果可能)。时序差异是不同函数调用序列的结果 - 在Python和C中 - 不是在不同的数据处理中。