On Di, 2016-04-05 at 09:48 -0700, mpc 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). >
Another point is timing your actual code, in this case you could have noticed that all time is spend in the while loops and little time in those min/max calls before. Algorithms, or what you do is the other thing. In the end, it seems your code is just a high dimensional histogram. Though I am not sure if numpy's histogram is fast, I am sure it vastly outperforms this and if you are interested in how it does this, you could even check its code, it is just in python (though numpy internally always has quite a lot of fun boilerplate to make sure of corner cases). And if you search for what you want to do first, you may find faster solutions easily, batteries included and all, there are a lot of tools out there. The other point is, don't optimize much if you don't know exactly what you need to optimize. - Sebastian > > * # 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 >
signature.asc
Description: This is a digitally signed message part
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org https://mail.scipy.org/mailman/listinfo/numpy-discussion