将一个三维数组转换为二维数组

3
我想将一个形状为(m, n, l)的3D数组转换为如下形状的2D数组 (m*n, l):
A = [[[1, 2],[3, 4]],  [[5, 6],[7, 8]]]

to

B = [[1, 3, 2, 4], [5, 7, 6, 8]]

对于范围l内的每个i,我使用了

reshape(A[i, :, :], (1, -1), order='F')

它能够工作。但是,当我使用signal.hilbert(B)时,我会得到以下错误。

Traceback (most recent call last):   File "E:/IMFsPasesAndDifferences_FV/FollowingTheSameLogicAsMatlab.py", line 41, in <module>
    HilbertMatrix = signal.hilbert(TempMatrix)   File "C:\Users\Tiwa\Anaconda3\envs\IMFsPasesAndDifferences_FV\lib\site-packages\scipy\signal\signaltools.py", line 1624, in hilbert
    Xf = fftpack.fft(x, N, axis=axis)   File "C:\Users\Tiwa\Anaconda3\envs\IMFsPasesAndDifferences_FV\lib\site-packages\scipy\fftpack\basic.py", line 284, in fft
    return work_function(tmp,n,1,0,overwrite_x)
_fftpack.error: failed in converting 1st argument `x' of _fftpack.zrfft to C/Fortran array

我想知道是否有其他方法可以重新塑造矩阵,而不使用order='F'

提前感谢。


你能展示一下如何建立B吗?现在你的代码无法按照你所要求的方式生成数组。 - Mad Physicist
@MadPhysicist,您能否解释一下为什么在这种情况下应该避免使用“reshape”? - Mykola Zotko
@MykolaZotko。我们为什么要避免重塑?我不记得曾经说过这样的话。 - Mad Physicist
@MadPhysicist,您对答案“numpy.reshape(A,(2,-1))”发表了评论。 - Mykola Zotko
1
@MykolaZotko。哦,如果您先对数组进行准备,则重塑没有任何问题。仅执行重塑操作不会正确排序元素。 - Mad Physicist
显示剩余2条评论
2个回答

3
你展示的 reshape 是从 (l, m, n)(l, m * n),而不是 (l * m, n)。你可以通过交换最后两个轴来模拟 F order 但保持 C order:
B = np.swapaxes(A, -2, -1).reshape(A.shape[0], -1)

请注意,这将复制您的数据,因为交换后的数组不是连续的。

0

这个回答解决了你的问题吗?

import numpy as np

A = np.array([[[1, 2],[3, 4]],  [[5, 6],[7, 8]]])

B = A.T.reshape(-1, A.shape[2]).T


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接