2015-12-12 115 views
0

我知道一个类似的问题已被要求为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)数组。

回答

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可能会更好。


构建 '空间' 的一个非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)] 
+0

“[...],它看起来像与7个* 10个* 13个* 16个元件4维数组。 “ - 这正是我所追求的。对于不包括更多细节,我表示歉意,谢谢你的支持!作为最终结果,我想结束一个矩阵,例如。 “数据”,其中变量资源管理器中的“大小”参数显示(7,10,13,16)。我尝试了你的4个数组的列表,data = [[1,2 ...,7],[0,2,... 9],[1,... 13]等]。但是使用这种方法,'size'列显示4. ,但是它的大小显示为4 – AaronJPung

+0

'broadcast'很容易制作这种形状的数组。但你如何使用数组值呢?相乘在一起?添加?使用一个,忽略其余的?许多选择。用一些小阵列来演示。 – hpaulj

+0

最好在您的原始问题中添加详细信息;很难阅读长篇评论。但是,看看我的编辑,看看我的要求。 – hpaulj