附加到表的行

时间:2010-11-24 19:37:23

标签: arrays append wolfram-mathematica

我有一个二维列表和一维列表。我想将1D列表作为附加列插入到2D列表中。例如:

array = {{a,1,2},{b,2,3},{c,3,4}};
column = {x,y,z};

变为

final = {{a,1,2,x},{b,2,3,y},{c,3,4,z}};

我做得非常优雅:

Table[Insert[array[[i]], column[[i]], 4], {i, Length[array]}];

我的问题:在Mathematica中这样做的正确方法是什么?我不认为它需要我正在使用的循环。我的解决方案感觉很难看。

7 个答案:

答案 0 :(得分:14)

例如:

 Transpose@Append[Transpose@array, column]

你也可以制作一个像这样的函数:

 subListAppend = Transpose@Append[Transpose@#1, #2] &;
 subListAppend[array, column]

如果你经常使用它会更容易。当然,如果您想要在除结尾之外的任何地方插入,您可以使用Insert[]

subListInsert = Transpose@Insert[Transpose@#1, #2, #3] &;
subListInsert[array, column, 2]
--> {{a, x, 1, 2}, {b, y, 2, 3}, {c, z, 3, 4}}

编辑:由于强制性速度优化讨论已经开始,以下是使用this和10000x200数组的一些结果:

ArrayFlatten@{{array, List /@ column}}:             0.020 s
Transpose@Append[Transpose@array, column]:          0.067 s
MapThread[Append, {array, column}]:                 0.083 s  
MapThread[Insert[#1, #2, 4] &, {array, column}]:    0.095 s
Map[Flatten, Flatten[{array, column}, {2}]]:        0.26 s
ConstantArray based solution:                       0.29 s
Partition[Flatten@Transpose[{array, column}], 4]:   0.48 s

获胜者是ArrayFlatten

答案 1 :(得分:5)

另一种可能性是

result = ConstantArray[0, Dimensions[array] + {0, 1}];
result[[All, 1 ;; Last[Dimensions[array]]]] = array;
result[[All, -1]] = column;
对于大型数字矩阵,我的计算机上的速度似乎更快,尽管它需要一个额外的变量。如果您正在处理您想要使用的实值条目

result = ConstantArray[0.0, Dimensions[array] + {0, 1}];

保持速度增益。

还有

MapThread[Append, {array, column}]

这也是快速(和优雅的IMO),但会解压缩结果。 (但如果您在示例中有符号条目,则不需要考虑。)

答案 2 :(得分:5)

这是我尝试使用Join

In[11]:= Join[array,List/@column,2]
Out[11]= {{a,1,2,x},{b,2,3,y},{c,3,4,z}}

它可能与之前提到的程序中最快的一个相当。

答案 3 :(得分:3)

这个怎么样?

pos = 4;
MapThread[Insert[#1, #2, pos] &, {array, column}]

答案 4 :(得分:3)

我(有时)喜欢使用Flatten进行转置,因为它适用于“参差不齐”的数组。

Map[Flatten, Flatten[{array, column}, {2}]]

{{a,1,2,x},{b,2,3,y},{c,3,4,z}}

但是,如果该列只有2个元素

column2 = {x, y};
Map[Flatten, Flatten[{array, column2}, {2}]]

{{a,1,2,x},{b,2,3,y},{c,3,4}}

(Transpose在这里不起作用)

答案 5 :(得分:2)

仍然:

k= Partition[Flatten@Transpose[{#, {x, y, z}}], 4]&

k@ {{a, 1, 2}, {b, 2, 3}, {c, 3, 4}}

(*
-> {{a, 1, 2, x}, {b, 2, 3, y}, {c, 3, 4, z}}
*)

答案 6 :(得分:1)

虽然不像现有的一些方法那样实用或有效,但还有两个要添加到列表中:

ArrayPad[array, {0,{0,1}}, List /@ column]

PadRight[array, Dimensions[array] + {0, 1}, List /@ column]