我有一个二维列表和一维列表。我想将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中这样做的正确方法是什么?我不认为它需要我正在使用的循环。我的解决方案感觉很难看。
答案 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]