[Numpy-discussion] Multidimension array access in C via Python API

Benjamin Root ben.v.root at gmail.com
Tue Apr 5 13:56:28 EDT 2016


You might do better using scipy.spatial. It has very useful data structures
for handling spatial coordinates. I am not exactly sure how to use them for
this specific problem (not a domain expert), but I would imagine that the
QHull wrappers there might give you some useful tools.

Ben Root

On Tue, Apr 5, 2016 at 12:48 PM, mpc <matt.p.conte at gmail.com> wrote:

> The idea is that I want to thin a large 2D buffer of x,y,z points to a
> given
> resolution by dividing the data into equal sized "cubes" (i.e. resolution
> is
> number of cubes along each axis) and averaging the points inside each cube
> (if any).
>
>
> *    # Fill up buffer data for demonstration purposes with initial buffer
> of
> size 10,000,000 to reduce to 1,000,000
>     size = 10000000
>     buffer = np.ndarray(shape=(size,3), dtype=np.float)
>     # fill it up
>     buffer[:, 0] = np.random.ranf(size)
>     buffer[:, 1] = np.random.ranf(size)
>     buffer[:, 2] = np.random.ranf(size)
>
>     # Create result buffer to size of cubed resolution (i.e. 100 ^ 3 =
> 1,000,000)
>     resolution = 100
>     thinned_buffer = np.ndarray(shape=(resolution ** 3,3), dtype=np.float)
>
>     # Trying to convert the following into C to speed it up
>     x_buffer = buffer[:, 0]
>     y_buffer = buffer[:, 1]
>     z_buffer = buffer[:, 2]
>     min_x = x_buffer.min()
>     max_x = x_buffer.max()
>     min_y = y_buffer.min()
>     max_y = y_buffer.max()
>     min_z = z_buffer.min()
>     max_z = z_buffer.max()
>     z_block = (max_z - min_z) / resolution
>     x_block = (max_x - min_x) / resolution
>     y_block = (max_y - min_y) / resolution
>
>     current_idx = 0
>     x_idx = min_x
>     while x_idx < max_x:
>         y_idx = min_y
>         while y_idx < max_y:
>             z_idx = min_z
>             while z_idx < max_z:
>                 inside_block_points = np.where((x_buffer >= x_idx) &
>                                                              (x_buffer <=
> x_idx + x_block) &
>                                                              (y_buffer >=
> y_idx) &
>                                                              (y_buffer <=
> y_idx + y_block) &
>                                                              (z_buffer >=
> z_idx) &
>                                                              (z_buffer <=
> z_idx + z_block))
>                 if inside_block_points[0].size > 0:
>                     mean_point =
> buffer[inside_block_points[0]].mean(axis=0)
>                     thinned_buffer[current_idx] = mean_point
>                     current_idx += 1
>                 z_idx += z_block
>             y_idx += y_block
>         x_idx += x_block
>     return thin_buffer
> *
>
>
>
> --
> View this message in context:
> http://numpy-discussion.10968.n7.nabble.com/Multidimension-array-access-in-C-via-Python-API-tp42710p42726.html
> Sent from the Numpy-discussion mailing list archive at Nabble.com.
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> https://mail.scipy.org/mailman/listinfo/numpy-discussion
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20160405/37f9374d/attachment.html>


More information about the NumPy-Discussion mailing list