组合两个列表和一个阵列以创建3D数据列表

时间:2016-01-14 22:54:31

标签: wolfram-mathematica

假设我有以下三个列表:

x = {i, j};
y = {a, b, c};
z = {{1, 2, 3}, {4, 5, 6}};

其中z是与xy坐标相对应的数据,z(x_i,y_j) = z_ij。我需要创建一个以下形式的数组:

zz = {{i, a, 1}, {i, b, 2}, {i, c, 3}, {j, a, 4}, {j, b, 5}, {j, c, 6}}

如何在Mathematica 10.0中有效地进行操作?

到目前为止,这是我的尝试:

zz = Table[{x[[ii]], y[[jj]], z[[ii, jj]]}, {ii, 1, Length[x]}, {jj, 1, Length[y]}]~Flatten~1

我的最终目标是绘制(ListPlot3D[zz])或插入此数据(Interpolation[zz]),xy可能是非均匀采样的。

3 个答案:

答案 0 :(得分:3)

简化比尔的回答

x = {i, j};
y = {a, b, c};
z = {{1, 2, 3}, {4, 5, 6}};

MapThread[Append, {Flatten[Outer[List, x, y], 1], Flatten@z}]
  

{{i,a,1},{i,b,2},{i,c,3},{j,a,4},{j,b,5},{j,c,6 }}

另外

Transpose@Append[Transpose@Tuples@{x, y}, Flatten@z]
  

{{i,a,1},{i,b,2},{i,c,3},{j,a,4},{j,b,5},{j,c,6 }}

答案 1 :(得分:2)

也许

x = {i, j}; y = {a, b, c}; z = {{1, 2, 3}, {4, 5, 6}};
zz=MapThread[Flatten[List[#1,#2]] &, {Flatten[Outer[List,x,y],1], Flatten[z]}]

返回

{{i, a, 1}, {i, b, 2}, {i, c, 3}, {j, a, 4}, {j, b, 5}, {j, c, 6}}

似乎应该有一种更简单的方法。

答案 2 :(得分:0)

Join @@ (Thread[{x[[#]], y, z[[#]]}, List] & /@ {1, 2})
  

{{i,a,1},{i,b,2},{i,c,3},{j,a,4},{j,b,5},{j,c,6 }}