【问题标题】:stacking 2D matrix using Python使用 Python 堆叠二维矩阵
【发布时间】:2015-02-03 12:55:46
【问题描述】:

我有一个将 1024x1024 矩阵重塑为 32x32 矩阵的脚本。这是代码:

import numpy as np


filename = r'bb1e03'                    
background = r'bb1e03_background'               

size = 1024
resize = 32

n = np.arange(size)
T0 = np.loadtxt(filename, unpack=False)
bg = np.loadtxt(background, unpack=False)

T = T0-bg                                               

for s in n: # s here is the row number
    B = np.reshape(T[s], (resize, resize))
    B_rev = B[...,::-1]                                                                 
    name = str(filename) + '_column_'+ str.zfill(str(s), 4)   
    np.savetxt(name+'.txt', B_rev)

现在我需要堆叠所有 32x32 矩阵,这样最后我就有了一个 32x32x1024 矩阵。你能告诉我我该怎么做吗?我发现 np.dstack 可以完成这项工作,但我不知道如何将它包含在脚本中。

谢谢。

【问题讨论】:

    标签: python-2.7 matrix reshape


    【解决方案1】:

    由于np.dstack 需要所有矩阵的元组来堆叠,所以无论如何你都必须将它们分开存储。

    解决问题的一个简单方法是在生成矩阵时将重新整形的矩阵放置在堆叠结构中。

    stacked = np.empty((32, 32, 1024))
    for s in xrange(1024):
        B = T[s].reshape((32, 32))
        B_rev = B[..., ::-1]
        stacked[...,s] = B_rev
    

    您也可以使用一个衬垫一步完成此操作

    stacked = T.reshape((1024,32,32)).transpose((1,2,0))[:,::-1]
    

    这种方法应该是首选,因为我发现它比普通的 python 循环快 much (1000x)。

    【讨论】:

    • 我添加了另一种使用 oneliner 重塑矩阵的方法。
    • 第二个选项效果很好。第一个选项抱怨“我”没有定义。
    • 啊,是的,那里有一个错字,恐怕我现在已经改了。无论如何都应该首选第二种方法,因为它要快得多(1000 倍)。
    • 哦,我忘了问。以及如何转换回 32x32 矩阵?我需要它们,因为每个 32x32 矩阵都代表我必须进一步处理的图像。
    • 您可以使用stacked[...,i]访问每个单独的矩阵