Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

generate a patterned numpy matrix

Is it possible to generate a numpy matrix with a circular pattern of "1"s in a rest matrix of "0"s? So basically a

generate(ysize, xsize, ycenter, xcenter, radius)

Should look something like

[000000000]
[000000000]
[000001000]
[000011100]
[000111110]
[000011100]
[000001000]
[000000000]

(ok this looks stupid but on a 1000x1000 scale it would make sense)

Is there such a possibility in numpy?

like image 743
Jakob Avatar asked May 08 '26 21:05

Jakob


2 Answers

def generate(ysize, xsize, ycenter, xcenter, radius):
    x = np.arange(xsize)[None,:]
    y = np.arange(ysize)[:,None]
    return ((xcenter - x) ** 2 + (ycenter - y) ** 2 <= radius ** 2) * 1


generate(10,8,4,3,2)


array([[0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 1, 1, 1, 0, 0, 0],
       [0, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0]])
like image 108
eumiro Avatar answered May 11 '26 11:05

eumiro


A little more concisely than @eumiro's answer, but essentially the same.

import numpy

def generate(ysize, xsize, ycenter, xcenter, radius):
    x, y = numpy.mgrid[0:ysize,0:xsize]
    return ((x - ycenter)**2 + (y - xcenter)**2 <= radius**2) * 1
like image 32
Benjamin Avatar answered May 11 '26 12:05

Benjamin



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!