Numpy最快的3D到2D投影

use*_*362 2 python arrays optimization numpy

我有一个二进制数据的3D数组.我想把它投射到3个2D图像 - 侧面,正面,鸟眼.

我写了代码:

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
Run Code Online (Sandbox Code Playgroud)

但对于~700x300x300矩阵来说,这是非常缓慢的(75秒!).

实现此任务的最快方法是什么?

编辑:

为了保存图像,我使用了:

sideImage = Image.fromarray(side)
sideImage.convert('RGB').save("sideImage.png")
Run Code Online (Sandbox Code Playgroud)

tbc*_*tbc 5

当我拥有3D数据时,我倾向于将其视为具有2D图像的行,列和切片(或面板)的"立方体".每个切片或面板都是具有尺寸的2D图像(rows, cols).我通常会这样想:

3D数据立方体

(0,0,0)在的左上角是切片.使用numpy索引,只需选择您感兴趣的3D数组部分就可以轻松完成,而无需编写自己的循环:

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> np.set_printoptions(precision=2)

# Generate a 3D 'cube' of data
>>> data3D = np.random.uniform(0,10, 2*3*5).reshape((2,3,5))
>>> data3D
array([[[ 7.44,  1.14,  2.5 ,  3.3 ,  6.05],
        [ 1.53,  8.91,  1.63,  8.95,  2.46],
        [ 3.57,  3.29,  6.43,  8.81,  6.43]],

       [[ 4.67,  2.67,  5.29,  7.69,  7.59],
        [ 0.26,  2.88,  7.58,  3.27,  4.55],
        [ 5.84,  9.04,  7.16,  9.18,  5.68]]])

# Grab some "views" of the data
>>> front  = data3D[:,:,0]  # all rows and columns, first slice
>>> back   = data3D[:,:,-1] # all rows and cols, last slice
>>> top    = data3D[0,:,:]  # first row, all cols, all slices 
>>> bottom = data3D[-1,:,:] # last row, all cols, all slices
>>> r_side = data3D[:,-1,:] # all rows, last column, all slices
>>> l_side = data3D[:,0,:]  # all rows, first column, all slices
Run Code Online (Sandbox Code Playgroud)

看看前面的样子:

>>> plt.imshow(front, interpolation='none')
>>> plt.show()
Run Code Online (Sandbox Code Playgroud)

前面的数据立方体