【问题标题】:Appending 1D arrays together in a multidimensional array?将一维数组附加到多维数组中?
【发布时间】:2016-03-18 02:49:35
【问题描述】:

我知道C# 已经有人问过类似的问题,但是我有没有办法将单个的一维向量(可能具有不同的长度)附加在一起以形成一个多维数组?例如,我想将长度为 7、10、13 和 16 的 4 个单独的一维数组组合成一个 (7,10,13,16) 数组。

我尝试了类似以下的方法,但无济于事。

np.concatenate((data0[...,np.newaxis], data1[..., np.newaxis]), axis=2)

编辑 1: 为了说明我的最终目标,让我们假设您想知道汽车的效率。您有 4 个参数:车宽、车高、车身成分和车型年份。这些共同创造了一个过程空间,其中汽车的效率可以变化。每个参数由一个不同值的向量表示;每个向量都有不同数量的值元素。有了这个,您将拥有 4 个参数 + 汽车效率。我想构建这 5 个向量的(5D)数组。

【问题讨论】:

    标签: python numpy multidimensional-array append


    【解决方案1】:

    take 4 individual 1D arrays, of length 7, 10, 13, and 16 together into a (7,10,13,16) array

    numpy 中,像(7,10,13,16) 这样的元组通常指的是shape。在这种情况下,它看起来像一个包含 7*10*13*16 个元素的 4 维数组。

    但更现实的是,我认为您想要这 4 个数组的列表

    [[1,2...,7], [0,2,...9], [1,...13], etc]
    

    那些不能变成多维数组。这样的数组必须有相同数量的行、列等,而不是一个参差不齐的集合。

    dtype=object 的数组之类的东西,其中的元素可以是列表、数组、None 或任何 Python 对象。我几乎不愿意提及它,因为太多的 SO 问题似乎滥用了它。在大多数情况下,一个普通的 Python 列表也可以。

    要获得更多帮助,您需要更清楚自己所寻求的。

    当您说I've tried methods similar to the following, but to no avail. 之类的话时,您确实应该说出问题所在。你得到什么样的错误?错误信息?或者结果不是你想要的?细节(但不要太多!:))是一个很好的问题。


    要创建一个“进程空间”,您可以执行以下操作:

    小样本数组:

    In [676]: heights=np.array([40,50])
    In [677]: widths=np.array([60,65,70])
    In [678]: yrs=np.array([1995,1996,1997,1998])
    

    正确大小的全 0 空间:

    In [679]: eff=np.zeros((2,3,4))
    

    将所有值与公式相结合的“效率”计算

    In [680]: eff1=(yrs-1994)[None,None,:]/(heights[:,None,None]+widths[None,:,None])
    In [681]: eff1.shape
    Out[681]: (2, 3, 4)
    In [682]: eff1
    Out[682]: 
    array([[[ 0.01      ,  0.02      ,  0.03      ,  0.04      ],
            [ 0.00952381,  0.01904762,  0.02857143,  0.03809524],
            [ 0.00909091,  0.01818182,  0.02727273,  0.03636364]],
    
           [[ 0.00909091,  0.01818182,  0.02727273,  0.03636364],
            [ 0.00869565,  0.0173913 ,  0.02608696,  0.03478261],
            [ 0.00833333,  0.01666667,  0.025     ,  0.03333333]]])
    

    ix_ 是添加所有None 的便捷函数,将表达式简化为:

    In [695]: H,W,Y=np.ix_(heights,widths, yrs)
    In [696]: eff1=(Y-1994)/(H+W)
    

    我可以轻松地将这些输入数组中的每一个转换为 (2,3,4) 数组:

    HH, WW, YY = np.broadcast_arrays(H,W,Y)
    

    但是,如果您正在设想一个带有行和列标签的复杂“表格”,则最好使用pandas


    构造“空间”的非 numpy 方法是使用 itertools.product

    In [704]: import itertools
    In [705]: list(itertools.product(heights,widths,yrs))
    Out[705]: 
    [(40, 60, 1995),
     (40, 60, 1996),
     (40, 60, 1997),
     (40, 60, 1998),
     (40, 65, 1995),
     (40, 65, 1996),
     ...
     (50, 70, 1996),
     (50, 70, 1997),
     (50, 70, 1998)]
    

    【讨论】:

    • "[...] 它看起来像一个包含 7*10*13*16 个元素的 4 维数组。" ——这正是我所追求的。很抱歉没有提供更多细节,谢谢您的提醒!作为最终结果,我想得到一个矩阵,例如。 “数据”,变量资源管理器中的“大小”参数显示 (7,10,13,16)。我尝试了您建议的 4 个数组列表,data = [[1,2...,7], [0,2,...9], [1,...13], etc]。但是使用这种方法,'size'列显示4。但是this的大小显示为4
    • 使用broadcasting 可以很容易地制作这种形状的数组。但是你想如何使用数组值呢?相乘?添加?使用一个而忽略其余的?很多很多的选择。用几个小数组进行演示。
    • 最好在原始问题中添加详细信息;很难阅读长的 cmets。但是,请查看我的编辑以了解我的要求。
    猜你喜欢
    • 2016-05-29
    • 1970-01-01
    • 2019-11-21
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    相关资源
    最近更新 更多