Reputation: 31
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
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):
Upvotes: 2
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:
Upvotes: 0