Python 将一维numpy阵列转换为三维RGB阵列

Python 将一维numpy阵列转换为三维RGB阵列,python,arrays,numpy,rgb,Python,Arrays,Numpy,Rgb,将包含rgb数据的一维阵列转换为三维rgb阵列的最佳方法是什么 如果阵列按此顺序排列,则很容易(一次重塑) RGB RGB RGB RGB RGB 不管我的数组是什么形式 RRRR…GGGG…BBBB 有时甚至 GGGG…RRRR…BBBB(结果仍应为RGB而非GRB) 当然,我可以通过一些Python方法来实现这一点,我甚至尝试了一个numpy解决方案,它很有效,但显然是一个糟糕的解决方案,我想知道什么是最好的方法,也许是一个内置的numpy函数? 我的解决方案: for i in range

将包含rgb数据的一维阵列转换为三维rgb阵列的最佳方法是什么

如果阵列按此顺序排列,则很容易(一次重塑)

RGB RGB RGB RGB RGB

不管我的数组是什么形式

RRRR…GGGG…BBBB

有时甚至

GGGG…RRRR…BBBB(结果仍应为RGB而非GRB)

当然,我可以通过一些Python方法来实现这一点,我甚至尝试了一个numpy解决方案,它很有效,但显然是一个糟糕的解决方案,我想知道什么是最好的方法,也许是一个内置的numpy函数?

我的解决方案:

for i in range(len(video_string) // 921600 - 1):        # Consecutive frames iterated over.
    frame = video_string[921600 * i: 921600 * (i + 1)]  # One frame
    array = numpy.fromstring(frame, dtype=numpy.uint8)  # Numpy array from one frame.
    r = array[:307200].reshape(480, 640)
    g = array[307200:614400].reshape(480, 640)
    b = array[614400:].reshape(480, 640)
    rgb = numpy.dstack((b, r, g))                       # Bring them together as 3rd dimention
不要让for循环把你搞糊涂了,我只是把帧串在一起,就像视频一样,这不是问题的一部分

在这个问题中,r、g、b值已经是2d数组了,所以对我的情况没有帮助


Edit1:所需的数组形状为
640x480x3
重塑为
2D
,转置,然后重塑为
RRRR…GGGGGG…BBBBBB
形式的
3D
-

a1D.reshape(3,-1).T.reshape(height,-1,3) # assuming height is given
或者使用带有
Fortran
顺序的重塑,然后交换轴-

a1D.reshape(-1,height,3,order='F').swapaxes(0,1)
样本运行-

In [146]: np.random.seed(0)

In [147]: a = np.random.randint(11,99,(4,2,3)) # original rgb image

In [148]: a1D = np.ravel([a[...,0].ravel(), a[...,1].ravel(), a[...,2].ravel()])

In [149]: height = 4

In [150]: np.allclose(a, a1D.reshape(3,-1).T.reshape(height,-1,3))
Out[150]: True

In [151]: np.allclose(a, a1D.reshape(-1,height,3,order='F').swapaxes(0,1))
Out[151]: True

对于
GGGG….rrrrrr….bbbbbb
表单,只需附加:
[…,[1,0,2]

我们如何在不知道高度或宽度的情况下重塑为
3D
数组?@Divakar抱歉,我忘了提到,我将进行编辑,但是可以看到一个帧是921600字节,除以三,我们有307200字节,这是640x480的产品。谢谢您的回答,我的代码取决于性能,因此我将测试结果并在问题中发布,任何关于性能的建议都会被接受。@Rocky将随时通知我。我目前正在处理一些其他问题,当我回到这个问题时,我一定会与您分享结果:)