当已知轴数时,X.ravel()和X.reshape(s0*s1*s2)之间的差异

uho*_*hoh 3 numpy

看到这个答案我想知道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
Run Code Online (Sandbox Code Playgroud)

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

我想知道在这种情况下特定使用ravelreshape在这种情况下是否基本相同,或者如果您提前知道X的轴数,是否存在重大差异,优点或缺点.

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

hpa*_*ulj 7

看看他们__array_interface__并做一些时间.我能看到的唯一区别ravel是速度更快.

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

A.reshape(-1)
Run Code Online (Sandbox Code Playgroud)

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

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

ravel如果我只想让它成为1d 我会使用.我.reshape经常使用将1d(例如arange())更改为nd.

例如

np.arange(10).reshape(2,5).ravel()
Run Code Online (Sandbox Code Playgroud)

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


reshaperavelnumpyC代码中定义:

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

PyArray_Ravel(PyArrayObject *arr, NPY_ORDER order)需要近100行C代码.PyArray_Flatten如果订单发生变化,它就会受到影响.

在同一个文件中,reshape平底船newshape.反过来返回一个view是形状实际上没有改变,尝试_attempt_nocopy_reshape,并作为最后的手段返回一个PyArray_NewCopy.

两者都使用PyArray_NewshapePyArray_NewFromDescr- 取决于形状和顺序如何混合和匹配.

因此,需要仔细研究,确定重塑(1d)和ravel不同的地方.


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

np.ndarray((24,),buffer=A.data)
Run Code Online (Sandbox Code Playgroud)

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

  • 您当然不需要“做任何事”!回答问题是自愿的-不?但是现在我只能读python。也许别人可能知道吗? (3认同)