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

与(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)

| 归档时间: |
|
| 查看次数: |
4319 次 |
| 最近记录: |