在matlab和python中创建迭代数组

问题描述 投票:2回答:2

我试图将一段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输出有两个以上的维度。我如何维护一个创建相同输出的二维数组?

python arrays matlab numpy concatenation
2个回答
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


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垫片:enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.