结合两个列表和一个数组来创建一个 3D 数据列表

Combine two lists and one array to create a 3D data list

假设我有以下三个列表:

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

其中zxy坐标对应的数据,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可能是非均匀采样。

也许

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]}]

哪个returns

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

似乎应该有更简单的方法来做到这一点。

简化 Bill 的回答

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}}

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}}