Gaurav Girish
Gaurav Girish

Reputation: 31

Iterative array creation in matlab and python

I am trying to convert a snippet of MATLAB code into python, the MATLAB code is as follows:

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

which creates a 2d array that mimics a sierpinski carpet
my python implementation is as such:

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

I know I am missing something with the nature of how the arrays are concatenated, since my python output is coming up with more than two dimensions. How would I maintain a 2d array that creates the same output?

Upvotes: 3

Views: 151

Answers (2)

kuzand
kuzand

Reputation: 9806

You can use 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]])

For example, for count = 4, you get the following output (plotted with matplotlib -- if you are interested in making such plots let me know):

enter image description here

Upvotes: 2

Kardi Teknomo
Kardi Teknomo

Reputation: 1460

You need to set the M as two dimensional array first, then you can use concatenate, based on its axis. Next, in python, range is up to count exclusive. Thus, you need to add 1.

Your code is modified into the following:

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()

When you run it produces beautiful Sierpinski Gasket: enter image description here

Upvotes: 0

Related Questions