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.co...@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@scipy.org > https://mail.scipy.org/mailman/listinfo/numpy-discussion >
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org https://mail.scipy.org/mailman/listinfo/numpy-discussion