mathematica到python flatten

时间:2015-07-15 16:29:42

标签: python wolfram-mathematica

我无法直观地看到如何将以下内容转换为python。 mask2D是一个59x31阵列。 mask1D产生一个1829阵列。 Refs2D是一个50x59x31阵列,所以物理上它仍然是50x 59x31图像。

mask1D = Flatten[mask2D];
indexmask1D = Flatten[Position[mask1D, 1]];
Refs1D = Transpose[Flatten[Refs2D, {2, 3}]][[All, indexmask1D]];

但是在Mathematica中,indexmask1D是一个1201数组。所以我得出结论,indexmask1D可以表示为:

x = []
for i in range(len(mask1D)):
if mask1D[i] == 1:
    x.append(i)
indexmask1D = np.asarray(x)

我的问题来自Refs1D系列。我不明白如何正确压扁Refs2D。在Mathematica中,展平导致1829x50阵列。我可以从物理上理解它在图像中是像素到像素并从每个图像中收集每个像素(产生1829个像素,每个像素有50个值)。我不知道Mathematica知道[[All,indexmask1D]]正在做什么,因为转置部分是50x1829矩阵,indexmask1D是1201矩阵。你怎么能成倍增加,如何在python中编写代码?

编辑:我最后直言不讳地说:

x1 = []
for a,b in enumerate(Refs2D):
    for c,d in enumerate(b):
        for e,f in enumerate(d):
            x1.append(Refs2D[:,c,e])
x1a = np.asarray(x1[:59*31])
Refs1D = np.ndarray.transpose(x1a)[:,indexmask1D]

1 个答案:

答案 0 :(得分:0)

这可能会有所帮助,重写mathematica中可能更容易理解的那一行:

 Transpose[Flatten[Refs2D, {2, 3}]][[All, indexmask1D]]

相当于:

 Table[Table[Flatten[Refs2D[[i]]][[k]], {k, indexmask1D}],
      {i,Length@Refs2D}]