在matlab和python中创建迭代数组

时间:2018-03-01 08:46:27

标签: python arrays matlab numpy concatenation

我正在尝试将一段MATLAB代码转换为python,MATLAB代码如下:

M = 0;
for k=1:i
    M = [M,        M,      M;
    M, ones(3^(k-1)), M;
    M,        M,      M];
end

创建一个模仿sierpinski地毯的二维数组 我的python实现是这样的:

M = 0   
for x in range(1,count):
        square = np.array([[M, M, M], [M, np.ones([3**(x-1),3**(x-1)]), M], [M, M, M]])

我知道我遗漏了数组如何连接的性质,因为我的python输出有两个以上的维度。我如何维护一个创建相同输出的二维数组呢?

2 个答案:

答案 0 :(得分:1)

您可以使用block()

import numpy as np
M = 0
for k in range(count):
    I = np.ones((3**k, 3**k))
    M = np.block([[M, M, M],
                  [M, I, M],
                  [M, M, M]])

例如,对于count = 4,您将获得以下输出(使用matplotlib绘制 - 如果您有兴趣制作此类图表让我知道):

enter image description here

答案 1 :(得分:0)

首先需要将M设置为二维数组,然后可以根据其轴使用连接。 接下来,在python中,范围可以计算为独占。因此,您需要添加1。

您的代码已修改为以下内容:

import numpy as np
import matplotlib.pylab as plt

def sierpinski(count=3):
    M = np.array([[0]])   
    for x in range(1,count+1):
        M = np.concatenate((np.concatenate((M, M, M), axis=1),
            np.concatenate((M, np.ones([3**(x-1),3**(x-1)]), M), axis=1),
            np.concatenate((M, M, M), axis=1)),axis=0)
    return M

# run the code
M=sierpinski()
plt.spy(M)
plt.show()

当你运行它时会产生美丽的Sierpinski垫片: https://www.immvestwolf.de/rent-a-home-2