在多维数组中将1D数组附加在一起?

时间:2015-12-12 04:32:02

标签: python numpy multidimensional-array append

我知道有一个类似的问题已经被要求C#了,但有没有办法让我将单个1D向量(可能有不同长度)附加在一起形成一个多维数组?例如,我想将4个单独的1D阵列,长度分别为7,10,13和16组合成一个(7,10,13,16)阵列。

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

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

编辑1: 为了说明我的最终目标,我们假设您想知道汽车的效率。您有4个参数:车宽,车身高度,车身构成和车型年份。这些共同创造了一个可以改变汽车效率的工艺空间。每个参数由不同值的向量表示;每个向量具有不同数量的值元素。有了这个,你就有4个参数+汽车效率。我想构建这5个向量的(5D)数组。

1 个答案:

答案 0 :(得分:0)

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的数组,其中元素可以是列表,数组,无或任何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

构建空间的非笨拙方式。是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)]