How to create sphere inside a ndarray python?










0















I have a ndarray size of 32x32x32. I want to create a sphere inside the array with center at (x,y) and radius 4 pixels. The value of sphere is 1 while value of array is 0. How could I do it in python? Thanks so much



This is code to generate the array



import numpy as np
A = np.zeros((32,32,32))
print (A)









share|improve this question
























  • What do you mean by "cube (circle)"? Cubes aren't circles.

    – user2357112
    Nov 15 '18 at 19:25











  • Do you want a circle (2D) or a sphere (3D)?

    – Siddharth Satpathy
    Nov 15 '18 at 19:26











  • Please read and follow the posting guidelines in the help documentation, as suggested when you created this account. On topic, how to ask, and ... the perfect question apply here. For instance, give an example of what you want, and post your coding attempt.

    – Prune
    Nov 15 '18 at 19:27






  • 1





    How about trying something? You only need to iterate over the 8x8x8 cube centred on (x,y,z) rather than the whole array...

    – Mark Setchell
    Nov 15 '18 at 21:42






  • 1





    Possible duplicate of How to generate a sphere in 3D Numpy array

    – norok2
    Feb 8 at 10:54















0















I have a ndarray size of 32x32x32. I want to create a sphere inside the array with center at (x,y) and radius 4 pixels. The value of sphere is 1 while value of array is 0. How could I do it in python? Thanks so much



This is code to generate the array



import numpy as np
A = np.zeros((32,32,32))
print (A)









share|improve this question
























  • What do you mean by "cube (circle)"? Cubes aren't circles.

    – user2357112
    Nov 15 '18 at 19:25











  • Do you want a circle (2D) or a sphere (3D)?

    – Siddharth Satpathy
    Nov 15 '18 at 19:26











  • Please read and follow the posting guidelines in the help documentation, as suggested when you created this account. On topic, how to ask, and ... the perfect question apply here. For instance, give an example of what you want, and post your coding attempt.

    – Prune
    Nov 15 '18 at 19:27






  • 1





    How about trying something? You only need to iterate over the 8x8x8 cube centred on (x,y,z) rather than the whole array...

    – Mark Setchell
    Nov 15 '18 at 21:42






  • 1





    Possible duplicate of How to generate a sphere in 3D Numpy array

    – norok2
    Feb 8 at 10:54













0












0








0








I have a ndarray size of 32x32x32. I want to create a sphere inside the array with center at (x,y) and radius 4 pixels. The value of sphere is 1 while value of array is 0. How could I do it in python? Thanks so much



This is code to generate the array



import numpy as np
A = np.zeros((32,32,32))
print (A)









share|improve this question
















I have a ndarray size of 32x32x32. I want to create a sphere inside the array with center at (x,y) and radius 4 pixels. The value of sphere is 1 while value of array is 0. How could I do it in python? Thanks so much



This is code to generate the array



import numpy as np
A = np.zeros((32,32,32))
print (A)






python numpy






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 16 '18 at 1:19









Siddharth Satpathy

5741516




5741516










asked Nov 15 '18 at 19:21









Moon LeeMoon Lee

84112




84112












  • What do you mean by "cube (circle)"? Cubes aren't circles.

    – user2357112
    Nov 15 '18 at 19:25











  • Do you want a circle (2D) or a sphere (3D)?

    – Siddharth Satpathy
    Nov 15 '18 at 19:26











  • Please read and follow the posting guidelines in the help documentation, as suggested when you created this account. On topic, how to ask, and ... the perfect question apply here. For instance, give an example of what you want, and post your coding attempt.

    – Prune
    Nov 15 '18 at 19:27






  • 1





    How about trying something? You only need to iterate over the 8x8x8 cube centred on (x,y,z) rather than the whole array...

    – Mark Setchell
    Nov 15 '18 at 21:42






  • 1





    Possible duplicate of How to generate a sphere in 3D Numpy array

    – norok2
    Feb 8 at 10:54

















  • What do you mean by "cube (circle)"? Cubes aren't circles.

    – user2357112
    Nov 15 '18 at 19:25











  • Do you want a circle (2D) or a sphere (3D)?

    – Siddharth Satpathy
    Nov 15 '18 at 19:26











  • Please read and follow the posting guidelines in the help documentation, as suggested when you created this account. On topic, how to ask, and ... the perfect question apply here. For instance, give an example of what you want, and post your coding attempt.

    – Prune
    Nov 15 '18 at 19:27






  • 1





    How about trying something? You only need to iterate over the 8x8x8 cube centred on (x,y,z) rather than the whole array...

    – Mark Setchell
    Nov 15 '18 at 21:42






  • 1





    Possible duplicate of How to generate a sphere in 3D Numpy array

    – norok2
    Feb 8 at 10:54
















What do you mean by "cube (circle)"? Cubes aren't circles.

– user2357112
Nov 15 '18 at 19:25





What do you mean by "cube (circle)"? Cubes aren't circles.

– user2357112
Nov 15 '18 at 19:25













Do you want a circle (2D) or a sphere (3D)?

– Siddharth Satpathy
Nov 15 '18 at 19:26





Do you want a circle (2D) or a sphere (3D)?

– Siddharth Satpathy
Nov 15 '18 at 19:26













Please read and follow the posting guidelines in the help documentation, as suggested when you created this account. On topic, how to ask, and ... the perfect question apply here. For instance, give an example of what you want, and post your coding attempt.

– Prune
Nov 15 '18 at 19:27





Please read and follow the posting guidelines in the help documentation, as suggested when you created this account. On topic, how to ask, and ... the perfect question apply here. For instance, give an example of what you want, and post your coding attempt.

– Prune
Nov 15 '18 at 19:27




1




1





How about trying something? You only need to iterate over the 8x8x8 cube centred on (x,y,z) rather than the whole array...

– Mark Setchell
Nov 15 '18 at 21:42





How about trying something? You only need to iterate over the 8x8x8 cube centred on (x,y,z) rather than the whole array...

– Mark Setchell
Nov 15 '18 at 21:42




1




1





Possible duplicate of How to generate a sphere in 3D Numpy array

– norok2
Feb 8 at 10:54





Possible duplicate of How to generate a sphere in 3D Numpy array

– norok2
Feb 8 at 10:54












3 Answers
3






active

oldest

votes


















3














Since array indexes only have a certain level of specificity (i.e. you can only subdivide down to the width, in this case 32), there's no one perfect way to represent a sphere in an array. Instead, we can treat each array index as a space of cubic area, where the [x][y][z] indices of the index represent the the cubic area's center coordinates. To create the sphere, we evaluate whether the sphere's presence in that area of space meets certain criteria.



We start with the equation for a sphere. From Wikipedia:




In analytic geometry, a sphere with center (x0, y0, z0) and radius r is the locus of all points (x, y, z) such that



(x - x0)^2 + (y - y0)^2 + (z - z0)^2 <= r^2.




For an array of dimensions N, the center will have the coordinate (N - 1) / 2 for all dimensions. (because for an even-numbered dimension, the center should be between the two center points, and for an odd-numbered dimension, the center should be an integer.) The magnitude of the radius can vary depending on where you decide the boundaries of the sphere relative to our imagined cubic array representation; re-reading the question, I notice you already gave the desired radius: 4.



There are two evaluation criteria I can think of:



Simple approach



In this approach, we will simply use a test of whether the array index's cubic area's center lies within the circle equation.



You can see Siddharth Satpathy's answer for some code using this approach.



Sophisticated approach



Ideally for me, the equation would decide whether an index lies within the sphere by assessing whether the proportion of sphere for that cubic area is greater than 50%. However, this approach unfortunately goes beyond my current working mathematical knowledge.




In regards to a discussion I had in the comments, neither approach is better than the other since they represent different perspectives: I personally imagine the array as being actually representative of the cubic area for each index, while others may imagine the indexes being the center points of these cubic areas.






share|improve this answer

























  • ".. whether the proportion of sphere for that cubic area is greater than 50%." An interesting idea. If you consider each data point a cube, then you can test if its center is inside the sphere. That ought to do it – at least for spheres larger than a single cube.

    – usr2564301
    Nov 15 '18 at 21:53






  • 1





    @usr2564301 The center of a point's cube being inside the sphere doesn't guarantee that the area occupied inside that cube is greater than 50%. While the first approach is a good approximation, I think a 50% comparison is more satisfying in certain ways. But I think the difference lies in perspective of what the array indexes represent: cubic area measurements, or the center points of these cubic areas. Your argument seems to be based on the array indexes being the centers' coordinates, while I am thinking of them as proportions of cubic area.

    – Graham
    Nov 15 '18 at 22:02



















3














Very good question. You can try the following code. In the below mentioned code AA is the matrix that you want. =)



import numpy as np
from copy import deepcopy

''' size : size of original 3D numpy matrix A.
radius : radius of circle inside A which will be filled with ones.
'''
size, radius = 5, 2

''' A : numpy.ndarray of shape size*size*size. '''
A = np.zeros((size,size, size))

''' AA : copy of A (you don't want the original copy of A to be overwritten.) '''
AA = deepcopy(A)

''' (x0, y0, z0) : coordinates of center of circle inside A. '''
x0, y0, z0 = int(np.floor(A.shape[0]/2)),
int(np.floor(A.shape[1]/2)), int(np.floor(A.shape[2]/2))


for x in range(x0-radius, x0+radius+1):
for y in range(y0-radius, y0+radius+1):
for z in range(z0-radius, z0+radius+1):
''' deb: measures how far a coordinate in A is far from the center.
deb>=0: inside the sphere.
deb<0: outside the sphere.'''
deb = radius - abs(x0-x) - abs(y0-y) - abs(z0-z)
if (deb)>=0: AA[x,y,z] = 1


Following is an example of the output for size=5 and radius=2 (a sphere of radius 2 pixels inside a numpy array of shape 5*5*5):



[[[0. 0. 0. 0. 0.]
[0. 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. 1. 0. 0.]
[0. 1. 1. 1. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 0. 0.]]

[[0. 0. 1. 0. 0.]
[0. 1. 1. 1. 0.]
[1. 1. 1. 1. 1.]
[0. 1. 1. 1. 0.]
[0. 0. 1. 0. 0.]]

[[0. 0. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 1. 1. 1. 0.]
[0. 0. 1. 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. 0.]
[0. 0. 0. 0. 0.]]]


I haven't printed the output for the size and radius that you had asked for (size=32 and radius=4), as the output will be very long.






share|improve this answer
































    0














    Using a combination of indexing, distance calculation and masking (all with numpy):



    import numpy as np
    center = (31/2, 31/2, 31/2) # if it is centered
    size = (32, 32, 32)
    max_dist = 4
    distance = np.linalg.norm(np.subtract(np.indices(size).T, np.asarray(center)), axis=2)
    #print(distance)
    mask = np.ones(size) * (distance < max_dist)
    print(mask)


    np.indices creates an index in the form [[[(i, j, k)]]], np.substract calculates the vector difference to your center, and np.linalg.norm calculates the vector norm. The rest is just using a mask operation on the distance array.



    Does that work?



    EDIT: an example with (3,3,3) for clarity purposes



    center = (1, 1, 1)
    size = (3, 3, 3)
    distance = np.linalg.norm(np.subtract(np.indices(size).T,np.asarray(center)), axis=len(center))
    mask = np.ones(size) * (distance<=1)
    print(mask)

    >>[[[0. 0. 0.]
    [0. 1. 0.]
    [0. 0. 0.]]

    [[0. 1. 0.]
    [1. 1. 1.]
    [0. 1. 0.]]

    [[0. 0. 0.]
    [0. 1. 0.]
    [0. 0. 0.]]]





    share|improve this answer
























      Your Answer






      StackExchange.ifUsing("editor", function ()
      StackExchange.using("externalEditor", function ()
      StackExchange.using("snippets", function ()
      StackExchange.snippets.init();
      );
      );
      , "code-snippets");

      StackExchange.ready(function()
      var channelOptions =
      tags: "".split(" "),
      id: "1"
      ;
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function()
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled)
      StackExchange.using("snippets", function()
      createEditor();
      );

      else
      createEditor();

      );

      function createEditor()
      StackExchange.prepareEditor(
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader:
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      ,
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      );



      );













      draft saved

      draft discarded


















      StackExchange.ready(
      function ()
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53326570%2fhow-to-create-sphere-inside-a-ndarray-python%23new-answer', 'question_page');

      );

      Post as a guest















      Required, but never shown

























      3 Answers
      3






      active

      oldest

      votes








      3 Answers
      3






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      3














      Since array indexes only have a certain level of specificity (i.e. you can only subdivide down to the width, in this case 32), there's no one perfect way to represent a sphere in an array. Instead, we can treat each array index as a space of cubic area, where the [x][y][z] indices of the index represent the the cubic area's center coordinates. To create the sphere, we evaluate whether the sphere's presence in that area of space meets certain criteria.



      We start with the equation for a sphere. From Wikipedia:




      In analytic geometry, a sphere with center (x0, y0, z0) and radius r is the locus of all points (x, y, z) such that



      (x - x0)^2 + (y - y0)^2 + (z - z0)^2 <= r^2.




      For an array of dimensions N, the center will have the coordinate (N - 1) / 2 for all dimensions. (because for an even-numbered dimension, the center should be between the two center points, and for an odd-numbered dimension, the center should be an integer.) The magnitude of the radius can vary depending on where you decide the boundaries of the sphere relative to our imagined cubic array representation; re-reading the question, I notice you already gave the desired radius: 4.



      There are two evaluation criteria I can think of:



      Simple approach



      In this approach, we will simply use a test of whether the array index's cubic area's center lies within the circle equation.



      You can see Siddharth Satpathy's answer for some code using this approach.



      Sophisticated approach



      Ideally for me, the equation would decide whether an index lies within the sphere by assessing whether the proportion of sphere for that cubic area is greater than 50%. However, this approach unfortunately goes beyond my current working mathematical knowledge.




      In regards to a discussion I had in the comments, neither approach is better than the other since they represent different perspectives: I personally imagine the array as being actually representative of the cubic area for each index, while others may imagine the indexes being the center points of these cubic areas.






      share|improve this answer

























      • ".. whether the proportion of sphere for that cubic area is greater than 50%." An interesting idea. If you consider each data point a cube, then you can test if its center is inside the sphere. That ought to do it – at least for spheres larger than a single cube.

        – usr2564301
        Nov 15 '18 at 21:53






      • 1





        @usr2564301 The center of a point's cube being inside the sphere doesn't guarantee that the area occupied inside that cube is greater than 50%. While the first approach is a good approximation, I think a 50% comparison is more satisfying in certain ways. But I think the difference lies in perspective of what the array indexes represent: cubic area measurements, or the center points of these cubic areas. Your argument seems to be based on the array indexes being the centers' coordinates, while I am thinking of them as proportions of cubic area.

        – Graham
        Nov 15 '18 at 22:02
















      3














      Since array indexes only have a certain level of specificity (i.e. you can only subdivide down to the width, in this case 32), there's no one perfect way to represent a sphere in an array. Instead, we can treat each array index as a space of cubic area, where the [x][y][z] indices of the index represent the the cubic area's center coordinates. To create the sphere, we evaluate whether the sphere's presence in that area of space meets certain criteria.



      We start with the equation for a sphere. From Wikipedia:




      In analytic geometry, a sphere with center (x0, y0, z0) and radius r is the locus of all points (x, y, z) such that



      (x - x0)^2 + (y - y0)^2 + (z - z0)^2 <= r^2.




      For an array of dimensions N, the center will have the coordinate (N - 1) / 2 for all dimensions. (because for an even-numbered dimension, the center should be between the two center points, and for an odd-numbered dimension, the center should be an integer.) The magnitude of the radius can vary depending on where you decide the boundaries of the sphere relative to our imagined cubic array representation; re-reading the question, I notice you already gave the desired radius: 4.



      There are two evaluation criteria I can think of:



      Simple approach



      In this approach, we will simply use a test of whether the array index's cubic area's center lies within the circle equation.



      You can see Siddharth Satpathy's answer for some code using this approach.



      Sophisticated approach



      Ideally for me, the equation would decide whether an index lies within the sphere by assessing whether the proportion of sphere for that cubic area is greater than 50%. However, this approach unfortunately goes beyond my current working mathematical knowledge.




      In regards to a discussion I had in the comments, neither approach is better than the other since they represent different perspectives: I personally imagine the array as being actually representative of the cubic area for each index, while others may imagine the indexes being the center points of these cubic areas.






      share|improve this answer

























      • ".. whether the proportion of sphere for that cubic area is greater than 50%." An interesting idea. If you consider each data point a cube, then you can test if its center is inside the sphere. That ought to do it – at least for spheres larger than a single cube.

        – usr2564301
        Nov 15 '18 at 21:53






      • 1





        @usr2564301 The center of a point's cube being inside the sphere doesn't guarantee that the area occupied inside that cube is greater than 50%. While the first approach is a good approximation, I think a 50% comparison is more satisfying in certain ways. But I think the difference lies in perspective of what the array indexes represent: cubic area measurements, or the center points of these cubic areas. Your argument seems to be based on the array indexes being the centers' coordinates, while I am thinking of them as proportions of cubic area.

        – Graham
        Nov 15 '18 at 22:02














      3












      3








      3







      Since array indexes only have a certain level of specificity (i.e. you can only subdivide down to the width, in this case 32), there's no one perfect way to represent a sphere in an array. Instead, we can treat each array index as a space of cubic area, where the [x][y][z] indices of the index represent the the cubic area's center coordinates. To create the sphere, we evaluate whether the sphere's presence in that area of space meets certain criteria.



      We start with the equation for a sphere. From Wikipedia:




      In analytic geometry, a sphere with center (x0, y0, z0) and radius r is the locus of all points (x, y, z) such that



      (x - x0)^2 + (y - y0)^2 + (z - z0)^2 <= r^2.




      For an array of dimensions N, the center will have the coordinate (N - 1) / 2 for all dimensions. (because for an even-numbered dimension, the center should be between the two center points, and for an odd-numbered dimension, the center should be an integer.) The magnitude of the radius can vary depending on where you decide the boundaries of the sphere relative to our imagined cubic array representation; re-reading the question, I notice you already gave the desired radius: 4.



      There are two evaluation criteria I can think of:



      Simple approach



      In this approach, we will simply use a test of whether the array index's cubic area's center lies within the circle equation.



      You can see Siddharth Satpathy's answer for some code using this approach.



      Sophisticated approach



      Ideally for me, the equation would decide whether an index lies within the sphere by assessing whether the proportion of sphere for that cubic area is greater than 50%. However, this approach unfortunately goes beyond my current working mathematical knowledge.




      In regards to a discussion I had in the comments, neither approach is better than the other since they represent different perspectives: I personally imagine the array as being actually representative of the cubic area for each index, while others may imagine the indexes being the center points of these cubic areas.






      share|improve this answer















      Since array indexes only have a certain level of specificity (i.e. you can only subdivide down to the width, in this case 32), there's no one perfect way to represent a sphere in an array. Instead, we can treat each array index as a space of cubic area, where the [x][y][z] indices of the index represent the the cubic area's center coordinates. To create the sphere, we evaluate whether the sphere's presence in that area of space meets certain criteria.



      We start with the equation for a sphere. From Wikipedia:




      In analytic geometry, a sphere with center (x0, y0, z0) and radius r is the locus of all points (x, y, z) such that



      (x - x0)^2 + (y - y0)^2 + (z - z0)^2 <= r^2.




      For an array of dimensions N, the center will have the coordinate (N - 1) / 2 for all dimensions. (because for an even-numbered dimension, the center should be between the two center points, and for an odd-numbered dimension, the center should be an integer.) The magnitude of the radius can vary depending on where you decide the boundaries of the sphere relative to our imagined cubic array representation; re-reading the question, I notice you already gave the desired radius: 4.



      There are two evaluation criteria I can think of:



      Simple approach



      In this approach, we will simply use a test of whether the array index's cubic area's center lies within the circle equation.



      You can see Siddharth Satpathy's answer for some code using this approach.



      Sophisticated approach



      Ideally for me, the equation would decide whether an index lies within the sphere by assessing whether the proportion of sphere for that cubic area is greater than 50%. However, this approach unfortunately goes beyond my current working mathematical knowledge.




      In regards to a discussion I had in the comments, neither approach is better than the other since they represent different perspectives: I personally imagine the array as being actually representative of the cubic area for each index, while others may imagine the indexes being the center points of these cubic areas.







      share|improve this answer














      share|improve this answer



      share|improve this answer








      edited Nov 15 '18 at 22:20

























      answered Nov 15 '18 at 21:45









      GrahamGraham

      621419




      621419












      • ".. whether the proportion of sphere for that cubic area is greater than 50%." An interesting idea. If you consider each data point a cube, then you can test if its center is inside the sphere. That ought to do it – at least for spheres larger than a single cube.

        – usr2564301
        Nov 15 '18 at 21:53






      • 1





        @usr2564301 The center of a point's cube being inside the sphere doesn't guarantee that the area occupied inside that cube is greater than 50%. While the first approach is a good approximation, I think a 50% comparison is more satisfying in certain ways. But I think the difference lies in perspective of what the array indexes represent: cubic area measurements, or the center points of these cubic areas. Your argument seems to be based on the array indexes being the centers' coordinates, while I am thinking of them as proportions of cubic area.

        – Graham
        Nov 15 '18 at 22:02


















      • ".. whether the proportion of sphere for that cubic area is greater than 50%." An interesting idea. If you consider each data point a cube, then you can test if its center is inside the sphere. That ought to do it – at least for spheres larger than a single cube.

        – usr2564301
        Nov 15 '18 at 21:53






      • 1





        @usr2564301 The center of a point's cube being inside the sphere doesn't guarantee that the area occupied inside that cube is greater than 50%. While the first approach is a good approximation, I think a 50% comparison is more satisfying in certain ways. But I think the difference lies in perspective of what the array indexes represent: cubic area measurements, or the center points of these cubic areas. Your argument seems to be based on the array indexes being the centers' coordinates, while I am thinking of them as proportions of cubic area.

        – Graham
        Nov 15 '18 at 22:02

















      ".. whether the proportion of sphere for that cubic area is greater than 50%." An interesting idea. If you consider each data point a cube, then you can test if its center is inside the sphere. That ought to do it – at least for spheres larger than a single cube.

      – usr2564301
      Nov 15 '18 at 21:53





      ".. whether the proportion of sphere for that cubic area is greater than 50%." An interesting idea. If you consider each data point a cube, then you can test if its center is inside the sphere. That ought to do it – at least for spheres larger than a single cube.

      – usr2564301
      Nov 15 '18 at 21:53




      1




      1





      @usr2564301 The center of a point's cube being inside the sphere doesn't guarantee that the area occupied inside that cube is greater than 50%. While the first approach is a good approximation, I think a 50% comparison is more satisfying in certain ways. But I think the difference lies in perspective of what the array indexes represent: cubic area measurements, or the center points of these cubic areas. Your argument seems to be based on the array indexes being the centers' coordinates, while I am thinking of them as proportions of cubic area.

      – Graham
      Nov 15 '18 at 22:02






      @usr2564301 The center of a point's cube being inside the sphere doesn't guarantee that the area occupied inside that cube is greater than 50%. While the first approach is a good approximation, I think a 50% comparison is more satisfying in certain ways. But I think the difference lies in perspective of what the array indexes represent: cubic area measurements, or the center points of these cubic areas. Your argument seems to be based on the array indexes being the centers' coordinates, while I am thinking of them as proportions of cubic area.

      – Graham
      Nov 15 '18 at 22:02














      3














      Very good question. You can try the following code. In the below mentioned code AA is the matrix that you want. =)



      import numpy as np
      from copy import deepcopy

      ''' size : size of original 3D numpy matrix A.
      radius : radius of circle inside A which will be filled with ones.
      '''
      size, radius = 5, 2

      ''' A : numpy.ndarray of shape size*size*size. '''
      A = np.zeros((size,size, size))

      ''' AA : copy of A (you don't want the original copy of A to be overwritten.) '''
      AA = deepcopy(A)

      ''' (x0, y0, z0) : coordinates of center of circle inside A. '''
      x0, y0, z0 = int(np.floor(A.shape[0]/2)),
      int(np.floor(A.shape[1]/2)), int(np.floor(A.shape[2]/2))


      for x in range(x0-radius, x0+radius+1):
      for y in range(y0-radius, y0+radius+1):
      for z in range(z0-radius, z0+radius+1):
      ''' deb: measures how far a coordinate in A is far from the center.
      deb>=0: inside the sphere.
      deb<0: outside the sphere.'''
      deb = radius - abs(x0-x) - abs(y0-y) - abs(z0-z)
      if (deb)>=0: AA[x,y,z] = 1


      Following is an example of the output for size=5 and radius=2 (a sphere of radius 2 pixels inside a numpy array of shape 5*5*5):



      [[[0. 0. 0. 0. 0.]
      [0. 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. 1. 0. 0.]
      [0. 1. 1. 1. 0.]
      [0. 0. 1. 0. 0.]
      [0. 0. 0. 0. 0.]]

      [[0. 0. 1. 0. 0.]
      [0. 1. 1. 1. 0.]
      [1. 1. 1. 1. 1.]
      [0. 1. 1. 1. 0.]
      [0. 0. 1. 0. 0.]]

      [[0. 0. 0. 0. 0.]
      [0. 0. 1. 0. 0.]
      [0. 1. 1. 1. 0.]
      [0. 0. 1. 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. 0.]
      [0. 0. 0. 0. 0.]]]


      I haven't printed the output for the size and radius that you had asked for (size=32 and radius=4), as the output will be very long.






      share|improve this answer





























        3














        Very good question. You can try the following code. In the below mentioned code AA is the matrix that you want. =)



        import numpy as np
        from copy import deepcopy

        ''' size : size of original 3D numpy matrix A.
        radius : radius of circle inside A which will be filled with ones.
        '''
        size, radius = 5, 2

        ''' A : numpy.ndarray of shape size*size*size. '''
        A = np.zeros((size,size, size))

        ''' AA : copy of A (you don't want the original copy of A to be overwritten.) '''
        AA = deepcopy(A)

        ''' (x0, y0, z0) : coordinates of center of circle inside A. '''
        x0, y0, z0 = int(np.floor(A.shape[0]/2)),
        int(np.floor(A.shape[1]/2)), int(np.floor(A.shape[2]/2))


        for x in range(x0-radius, x0+radius+1):
        for y in range(y0-radius, y0+radius+1):
        for z in range(z0-radius, z0+radius+1):
        ''' deb: measures how far a coordinate in A is far from the center.
        deb>=0: inside the sphere.
        deb<0: outside the sphere.'''
        deb = radius - abs(x0-x) - abs(y0-y) - abs(z0-z)
        if (deb)>=0: AA[x,y,z] = 1


        Following is an example of the output for size=5 and radius=2 (a sphere of radius 2 pixels inside a numpy array of shape 5*5*5):



        [[[0. 0. 0. 0. 0.]
        [0. 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. 1. 0. 0.]
        [0. 1. 1. 1. 0.]
        [0. 0. 1. 0. 0.]
        [0. 0. 0. 0. 0.]]

        [[0. 0. 1. 0. 0.]
        [0. 1. 1. 1. 0.]
        [1. 1. 1. 1. 1.]
        [0. 1. 1. 1. 0.]
        [0. 0. 1. 0. 0.]]

        [[0. 0. 0. 0. 0.]
        [0. 0. 1. 0. 0.]
        [0. 1. 1. 1. 0.]
        [0. 0. 1. 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. 0.]
        [0. 0. 0. 0. 0.]]]


        I haven't printed the output for the size and radius that you had asked for (size=32 and radius=4), as the output will be very long.






        share|improve this answer



























          3












          3








          3







          Very good question. You can try the following code. In the below mentioned code AA is the matrix that you want. =)



          import numpy as np
          from copy import deepcopy

          ''' size : size of original 3D numpy matrix A.
          radius : radius of circle inside A which will be filled with ones.
          '''
          size, radius = 5, 2

          ''' A : numpy.ndarray of shape size*size*size. '''
          A = np.zeros((size,size, size))

          ''' AA : copy of A (you don't want the original copy of A to be overwritten.) '''
          AA = deepcopy(A)

          ''' (x0, y0, z0) : coordinates of center of circle inside A. '''
          x0, y0, z0 = int(np.floor(A.shape[0]/2)),
          int(np.floor(A.shape[1]/2)), int(np.floor(A.shape[2]/2))


          for x in range(x0-radius, x0+radius+1):
          for y in range(y0-radius, y0+radius+1):
          for z in range(z0-radius, z0+radius+1):
          ''' deb: measures how far a coordinate in A is far from the center.
          deb>=0: inside the sphere.
          deb<0: outside the sphere.'''
          deb = radius - abs(x0-x) - abs(y0-y) - abs(z0-z)
          if (deb)>=0: AA[x,y,z] = 1


          Following is an example of the output for size=5 and radius=2 (a sphere of radius 2 pixels inside a numpy array of shape 5*5*5):



          [[[0. 0. 0. 0. 0.]
          [0. 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. 1. 0. 0.]
          [0. 1. 1. 1. 0.]
          [0. 0. 1. 0. 0.]
          [0. 0. 0. 0. 0.]]

          [[0. 0. 1. 0. 0.]
          [0. 1. 1. 1. 0.]
          [1. 1. 1. 1. 1.]
          [0. 1. 1. 1. 0.]
          [0. 0. 1. 0. 0.]]

          [[0. 0. 0. 0. 0.]
          [0. 0. 1. 0. 0.]
          [0. 1. 1. 1. 0.]
          [0. 0. 1. 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. 0.]
          [0. 0. 0. 0. 0.]]]


          I haven't printed the output for the size and radius that you had asked for (size=32 and radius=4), as the output will be very long.






          share|improve this answer















          Very good question. You can try the following code. In the below mentioned code AA is the matrix that you want. =)



          import numpy as np
          from copy import deepcopy

          ''' size : size of original 3D numpy matrix A.
          radius : radius of circle inside A which will be filled with ones.
          '''
          size, radius = 5, 2

          ''' A : numpy.ndarray of shape size*size*size. '''
          A = np.zeros((size,size, size))

          ''' AA : copy of A (you don't want the original copy of A to be overwritten.) '''
          AA = deepcopy(A)

          ''' (x0, y0, z0) : coordinates of center of circle inside A. '''
          x0, y0, z0 = int(np.floor(A.shape[0]/2)),
          int(np.floor(A.shape[1]/2)), int(np.floor(A.shape[2]/2))


          for x in range(x0-radius, x0+radius+1):
          for y in range(y0-radius, y0+radius+1):
          for z in range(z0-radius, z0+radius+1):
          ''' deb: measures how far a coordinate in A is far from the center.
          deb>=0: inside the sphere.
          deb<0: outside the sphere.'''
          deb = radius - abs(x0-x) - abs(y0-y) - abs(z0-z)
          if (deb)>=0: AA[x,y,z] = 1


          Following is an example of the output for size=5 and radius=2 (a sphere of radius 2 pixels inside a numpy array of shape 5*5*5):



          [[[0. 0. 0. 0. 0.]
          [0. 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. 1. 0. 0.]
          [0. 1. 1. 1. 0.]
          [0. 0. 1. 0. 0.]
          [0. 0. 0. 0. 0.]]

          [[0. 0. 1. 0. 0.]
          [0. 1. 1. 1. 0.]
          [1. 1. 1. 1. 1.]
          [0. 1. 1. 1. 0.]
          [0. 0. 1. 0. 0.]]

          [[0. 0. 0. 0. 0.]
          [0. 0. 1. 0. 0.]
          [0. 1. 1. 1. 0.]
          [0. 0. 1. 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. 0.]
          [0. 0. 0. 0. 0.]]]


          I haven't printed the output for the size and radius that you had asked for (size=32 and radius=4), as the output will be very long.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Nov 15 '18 at 22:47

























          answered Nov 15 '18 at 21:43









          Siddharth SatpathySiddharth Satpathy

          5741516




          5741516





















              0














              Using a combination of indexing, distance calculation and masking (all with numpy):



              import numpy as np
              center = (31/2, 31/2, 31/2) # if it is centered
              size = (32, 32, 32)
              max_dist = 4
              distance = np.linalg.norm(np.subtract(np.indices(size).T, np.asarray(center)), axis=2)
              #print(distance)
              mask = np.ones(size) * (distance < max_dist)
              print(mask)


              np.indices creates an index in the form [[[(i, j, k)]]], np.substract calculates the vector difference to your center, and np.linalg.norm calculates the vector norm. The rest is just using a mask operation on the distance array.



              Does that work?



              EDIT: an example with (3,3,3) for clarity purposes



              center = (1, 1, 1)
              size = (3, 3, 3)
              distance = np.linalg.norm(np.subtract(np.indices(size).T,np.asarray(center)), axis=len(center))
              mask = np.ones(size) * (distance<=1)
              print(mask)

              >>[[[0. 0. 0.]
              [0. 1. 0.]
              [0. 0. 0.]]

              [[0. 1. 0.]
              [1. 1. 1.]
              [0. 1. 0.]]

              [[0. 0. 0.]
              [0. 1. 0.]
              [0. 0. 0.]]]





              share|improve this answer





























                0














                Using a combination of indexing, distance calculation and masking (all with numpy):



                import numpy as np
                center = (31/2, 31/2, 31/2) # if it is centered
                size = (32, 32, 32)
                max_dist = 4
                distance = np.linalg.norm(np.subtract(np.indices(size).T, np.asarray(center)), axis=2)
                #print(distance)
                mask = np.ones(size) * (distance < max_dist)
                print(mask)


                np.indices creates an index in the form [[[(i, j, k)]]], np.substract calculates the vector difference to your center, and np.linalg.norm calculates the vector norm. The rest is just using a mask operation on the distance array.



                Does that work?



                EDIT: an example with (3,3,3) for clarity purposes



                center = (1, 1, 1)
                size = (3, 3, 3)
                distance = np.linalg.norm(np.subtract(np.indices(size).T,np.asarray(center)), axis=len(center))
                mask = np.ones(size) * (distance<=1)
                print(mask)

                >>[[[0. 0. 0.]
                [0. 1. 0.]
                [0. 0. 0.]]

                [[0. 1. 0.]
                [1. 1. 1.]
                [0. 1. 0.]]

                [[0. 0. 0.]
                [0. 1. 0.]
                [0. 0. 0.]]]





                share|improve this answer



























                  0












                  0








                  0







                  Using a combination of indexing, distance calculation and masking (all with numpy):



                  import numpy as np
                  center = (31/2, 31/2, 31/2) # if it is centered
                  size = (32, 32, 32)
                  max_dist = 4
                  distance = np.linalg.norm(np.subtract(np.indices(size).T, np.asarray(center)), axis=2)
                  #print(distance)
                  mask = np.ones(size) * (distance < max_dist)
                  print(mask)


                  np.indices creates an index in the form [[[(i, j, k)]]], np.substract calculates the vector difference to your center, and np.linalg.norm calculates the vector norm. The rest is just using a mask operation on the distance array.



                  Does that work?



                  EDIT: an example with (3,3,3) for clarity purposes



                  center = (1, 1, 1)
                  size = (3, 3, 3)
                  distance = np.linalg.norm(np.subtract(np.indices(size).T,np.asarray(center)), axis=len(center))
                  mask = np.ones(size) * (distance<=1)
                  print(mask)

                  >>[[[0. 0. 0.]
                  [0. 1. 0.]
                  [0. 0. 0.]]

                  [[0. 1. 0.]
                  [1. 1. 1.]
                  [0. 1. 0.]]

                  [[0. 0. 0.]
                  [0. 1. 0.]
                  [0. 0. 0.]]]





                  share|improve this answer















                  Using a combination of indexing, distance calculation and masking (all with numpy):



                  import numpy as np
                  center = (31/2, 31/2, 31/2) # if it is centered
                  size = (32, 32, 32)
                  max_dist = 4
                  distance = np.linalg.norm(np.subtract(np.indices(size).T, np.asarray(center)), axis=2)
                  #print(distance)
                  mask = np.ones(size) * (distance < max_dist)
                  print(mask)


                  np.indices creates an index in the form [[[(i, j, k)]]], np.substract calculates the vector difference to your center, and np.linalg.norm calculates the vector norm. The rest is just using a mask operation on the distance array.



                  Does that work?



                  EDIT: an example with (3,3,3) for clarity purposes



                  center = (1, 1, 1)
                  size = (3, 3, 3)
                  distance = np.linalg.norm(np.subtract(np.indices(size).T,np.asarray(center)), axis=len(center))
                  mask = np.ones(size) * (distance<=1)
                  print(mask)

                  >>[[[0. 0. 0.]
                  [0. 1. 0.]
                  [0. 0. 0.]]

                  [[0. 1. 0.]
                  [1. 1. 1.]
                  [0. 1. 0.]]

                  [[0. 0. 0.]
                  [0. 1. 0.]
                  [0. 0. 0.]]]






                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Nov 16 '18 at 14:30

























                  answered Nov 16 '18 at 14:22









                  MstainoMstaino

                  1,8231412




                  1,8231412



























                      draft saved

                      draft discarded
















































                      Thanks for contributing an answer to Stack Overflow!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid


                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.

                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function ()
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53326570%2fhow-to-create-sphere-inside-a-ndarray-python%23new-answer', 'question_page');

                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      Top Tejano songwriter Luis Silva dead of heart attack at 64

                      政党

                      天津地下鉄3号線