You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过向列表追加数组得到指定维度顺序的多维数组

如何通过向列表追加数组得到指定维度顺序的多维数组

嘿,我来帮你搞定这个维度顺序的问题~ 先从你给的测试小例子说起,再延伸到你实际的卷积场景。

先看你的测试案例

你现在的代码运行后得到(100,3)的形状,但想要(3,100),有两种简单的解决方式:

  • 方式一:在追加时调整形状,最后拼接
    把每个要追加的数组改成列向量(shape为(3,1)),然后用concatenate沿着列方向拼接:

    import numpy as np
    trial = []
    for i in range(100):
        # 把数组转为(3,1)的列向量
        trial.append(np.array([1,2,5]).reshape(3,1))
    # 沿着axis=1拼接,得到(3,100)
    trial = np.concatenate(trial, axis=1)
    
  • 方式二:先按原方式生成,再转置
    如果你已经得到了(100,3)的数组,直接用转置就能得到想要的形状:

    trial = np.array(trial).T
    

    一维数组的转置会直接交换两个维度,完全满足需求。


再看你实际的卷积场景

你循环追加卷积结果后得到(30,16,16),想要的是(16,16,30),这里直接用.T确实存在隐患(如果维度1和2数值不同,结果就会出错),推荐下面两种更稳妥的方式:

  • 方式一:追加时增加维度,再拼接
    给每个卷积结果增加一个新的尾部维度(变成(16,16,1)),然后沿着这个新维度拼接:

    import numpy as np
    firststep = []
    for i in range(bunchoffilters1.shape[0]):
        conv_result = convolution(image, kernel=bunchoffilters1[i], non_linearity='sigmoid')
        # 给结果增加一个新维度,变成(16,16,1)
        firststep.append(conv_result[..., np.newaxis])
    # 沿着第2个维度拼接,得到(16,16,30)
    firststep = np.concatenate(firststep, axis=2)
    
  • 方式二:生成后用transpose指定维度顺序
    如果已经得到了(30,16,16)的数组,直接用transpose指定想要的维度顺序:

    firststep = np.array(firststep)
    # 把原维度1→新维度0,原维度2→新维度1,原维度0→新维度2
    firststep = firststep.transpose(1, 2, 0)
    

    这种方式不管原维度1和2是否相同,都能准确得到你想要的形状,非常稳妥。

  • 方式三:用列表推导式+stack一步到位
    如果你不需要保留中间的列表,可以直接用numpy.stack函数,一步生成目标形状:

    firststep = np.stack(
        [convolution(image, kernel=bunchoffilters1[i], non_linearity='sigmoid') 
         for i in range(bunchoffilters1.shape[0])],
        axis=2
    )
    

    stack会自动把每个(16,16)的数组沿着指定的axis=2堆叠,直接得到(16,16,30)的结果,代码更简洁。


备注:内容来源于stack exchange,提问作者DynoMonster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 11:24:07