Search code examples
numpyperformancezipreshape

Reshaping a coordinate list


I have 3xN dimensional array containing coordinates ([x1,x2,...xN],[y1,y2,...yN],[z1,z2,...zN]), I need to reshape it into a Nx3 dimensional array of coordinates ([x1,y1,z1],[x2,y2,z2],...,[xN,yN,zN]). I've tried the following:

n=int(1e7)
x=np.linspace(0,1,n)
y=np.linspace(0,1,n)
z=np.linspace(0,1,n)
pos=np.array([x,y,z])

newpos=np.array(list(zip(pos[0],pos[1],pos[2])))

The problem with the code above is that it's to slow for it's purposes. Not only, when using n=1e7 the code runs into a memory error. Is there any other way to achieve the desired purpose?


Solution

  • Test and show this process with a small n:

    In [9]: n = 5
    In [10]: x=np.linspace(0,1,n)
        ...: y=np.linspace(0,1,n)
        ...: z=np.linspace(0,1,n)
        ...: pos=np.array([x,y,z])
    In [11]: pos
    Out[11]: 
    array([[0.  , 0.25, 0.5 , 0.75, 1.  ],
           [0.  , 0.25, 0.5 , 0.75, 1.  ],
           [0.  , 0.25, 0.5 , 0.75, 1.  ]])
    In [12]: newpos=np.array(list(zip(pos[0],pos[1],pos[2])))
    In [13]: newpos
    Out[13]: 
    array([[0.  , 0.  , 0.  ],
           [0.25, 0.25, 0.25],
           [0.5 , 0.5 , 0.5 ],
           [0.75, 0.75, 0.75],
           [1.  , 1.  , 1.  ]])
    In [14]: pos.T
    Out[14]: 
    array([[0.  , 0.  , 0.  ],
           [0.25, 0.25, 0.25],
           [0.5 , 0.5 , 0.5 ],
           [0.75, 0.75, 0.75],
           [1.  , 1.  , 1.  ]])