user2290362 - 1 year ago 102
Python Question

# Numpy fastest 3D to 2D projection

I have a 3D array of binary data. I want to project this to 3 2D images - side on, head on, birds eye.

I have written the code:

``````for x in range(data.shape[2]):
for y in range(data.shape[0]):
val = 0
for z in range(data.shape[1]):
if data[y][z][x] > 0:
val = 255
break
side[y][x] = val
``````

But this is horrifically slow (75s!) for a ~700x300x300 matrix.

What is the fastest way of achieving this task?

EDIT:

To save the image, I have used:

``````sideImage = Image.fromarray(side)
sideImage.convert('RGB').save("sideImage.png")
``````

You can compute it as follows:

``````>>> data = np.random.random_sample((200, 300, 100)) > 0.5
>>> data.any(axis=-1).shape # show the result has the shape we want
(200, 300)
>>> data.any(axis=-1)
array([[ True,  True,  True, ...,  True,  True,  True],
[ True,  True,  True, ...,  True,  True,  True],
[ True,  True,  True, ...,  True,  True,  True],
...,
[ True,  True,  True, ...,  True,  True,  True],
[ True,  True,  True, ...,  True,  True,  True],
[ True,  True,  True, ...,  True,  True,  True]], dtype=bool)
>>>
``````

You can scale values if you need

``````>>> data.any(axis=-1) * 255
array([[255, 255, 255, ..., 255, 255, 255],
[255, 255, 255, ..., 255, 255, 255],
[255, 255, 255, ..., 255, 255, 255],
...,
[255, 255, 255, ..., 255, 255, 255],
[255, 255, 255, ..., 255, 255, 255],
[255, 255, 255, ..., 255, 255, 255]])
>>>
``````
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download