繁体   English   中英

如何在没有 for 循环的情况下将 3D 图像矩阵转换为二维矩阵? Python 和 numpy

[英]How to turn 3D image matrix to 2d matrix without a for loop? Python and numpy

目前在学校数据课程的实验室工作。 我想要做的是将具有形状(26,64,64)的matrix_a转换为新的matrix_b(64,1664)。 matrix_a 中的 (64,64) 是组成一系列图像的位,而 (64,1664) matrix_b 应该生成图像条。 我尝试使用 np.reshape,它确实正确地重塑了矩阵,但由于使用的排序,图像丢失了。 我可以使用 for 循环将每个 64x64 图像迭代地插入到 matrix_b 中,但他们要求您不要使用 for 循环。 他们提到了一些关于使用拼接的东西? 我在 python 和 numpy 中写这个。 抱歉,如果这篇文章没有意义,这是我的第一篇。 谢谢

使用 numpy,您可以试试这个(假设 data_3d 是您的 3d 阵列):

data_2d = data_3d.swapaxes(1,2).reshape(3,-1)
import numpy as np
arr = np.random.randint(10, size= [26,64,64])
arr.shape

>>> (26, 64, 64)

transpose()轴从[0, 1, 2]重新排序为[1, 0, 2]

arr = arr.transpose([1,0,2])   # edit suggested by @wwii 
arr.shape

>>> (64, 64, 26)
arr = arr.reshape([64, -1])
arr.shape

>>> (64, 1664)
>>> a = np.arange(2*2*3).reshape(3,2,2)
>>> a
array([[[ 0,  1],
        [ 2,  3]],

       [[ 4,  5],
        [ 6,  7]],

       [[ 8,  9],
        [10, 11]]])

连接每个图像。

水平条 - 这是您在问题中要求的。

>>> np.concatenate(list(a),-1)
array([[ 0,  1,  4,  5,  8,  9],
       [ 2,  3,  6,  7, 10, 11]])

竖条

>>> np.concatenate(list(a),0)
array([[ 0,  1],
       [ 2,  3],
       [ 4,  5],
       [ 6,  7],
       [ 8,  9],
       [10, 11]])
>>>

np.hstack(tuple(a))np.vstack(tuple(a))产生与concatenate相同的结果。

np.vsplit(a,a.shape[0])等价list(a)tuple(a)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM