gpt4 book ai didi

python - 提高循环 numpy 数组的速度

转载 作者:太空宇宙 更新时间:2023-11-03 21:08:11 24 4
gpt4 key购买 nike

我正在尝试在地面分类后分割 LiDAR 点云。我正在使用 numpy 创建点云(pc)的“图像”,并循环遍历 numpy 数组。我想加快循环速度或一起避免它。我将使用图像分割技术,但首先我需要运行此代码来创建一个“图像”,这是需要一段时间的部分。有没有办法提高或避免这个循环的速度?


import numpy as np
from math import ceil, floor


'''In this case:
pc = point cloud (X,Y,Z values)'''

# point cloud is in the numpy array, pc
minx,maxx,miny,maxy = floor(np.min(pc[:,0]-1)),ceil(np.max(pc[:,0]+1)),floor(np.min(pc[:,1]-1)),ceil(np.max(pc[:,1]+1))# x,y bounding box

# grid x and y direction (resolution: 0.2 meters)
gridx = np.linspace(minx,maxx,int((maxx - minx+0.2)*5),endpoint=True)
gridy = np.linspace(miny,maxy,int((maxy - miny +0.2)*5),endpoint=True)

#shape of the new image with 0.2 meter resolution.
imgx,imgy = int((maxx-minx+0.2)*5),int((maxy - miny +0.2)*5)

# this is what will be created at the end. It will be a binary image.
img = np.zeros((imgx,imgy))

#loop through array to generate image (this is the part that takes a while)
for x,i in enumerate(gridx):
for y,j in enumerate(gridy):

# Test if there any points in this "grid"
input_point = pc[np.where(((pc[:,0]>i) & (pc[:,0]<i+1))& ((pc[:,1]>j) & (pc[:,1]<j+1)))]
# if there are points, give pixel value 1.
if input_point.shape[0]!=0:
img[x,y]=1

print('Image made')


谢谢。

最佳答案

这是一个矢量化版本,它在随机测试集上产生相同的输出:

import numpy as np
from math import ceil, floor
import time

width = 0.2

t = [time.time()]

pc = np.random.uniform(-10, 10, (100, 3))

# point cloud is in the numpy array, pc
minx,maxx,miny,maxy = floor(np.min(pc[:,0]-1)),ceil(np.max(pc[:,0]+1)),floor(np.min(pc[:,1]-1)),ceil(np.max(pc[:,1]+1))# x,y bounding box

# grid x and y direction (resolution: 0.2 meters)
gridx = np.linspace(minx,maxx,int((maxx - minx+0.2)*5),endpoint=True)
gridy = np.linspace(miny,maxy,int((maxy - miny +0.2)*5),endpoint=True)

#shape of the new image with 0.2 meter resolution.
imgx,imgy = int((maxx-minx+0.2)*5),int((maxy - miny +0.2)*5)

print('Shared ops done')
t.append(time.time())

# this is what will be created at the end. It will be a binary image.
img = np.zeros((imgx,imgy))

#loop through array to generate image (this is the part that takes a while)
for x,i in enumerate(gridx):
for y,j in enumerate(gridy):

# Test if there any points in this "grid"
input_point = pc[np.where(((pc[:,0]>i) & (pc[:,0]<i+width))& ((pc[:,1]>j) & (pc[:,1]<j+width)))]
# if there are points, give pixel value 1.
if input_point.shape[0]!=0:
img[x,y]=1

t.append(time.time())
print('Image made')

if width == 0.2:
img2 = np.zeros((imgx, imgy), 'u1')
x2, y2 = (((pc[:, :2] - (minx, miny)) * (5, 5))).astype(int).T
img2[x2, y2] = 1

elif width == 1:
img2 = np.zeros((imgx+4, imgy+4), 'u1')
x2, y2 = (((pc[:, :2] - (minx, miny)) * (5, 5))).astype(int).T

np.lib.stride_tricks.as_strided(img2, (imgx, imgy, 5, 5), 2 * img2.strides)[x2, y2] = 1
img2 = img2[4:, 4:]

t.append(time.time())
print('Image remade')

print('took', np.diff(t), 'secs respectively')
assert((img2==img).all())
print('results equal')

您的代码生成 5x5 像素。这是故意的吗?我必须有点技巧才能重现它。

更新:添加了一个制作普通像素的版本。

示例运行:

Shared ops done
Image made
Image remade
took [2.29120255e-04 1.54510736e-01 1.44481659e-04] secs respectively
results equal

关于python - 提高循环 numpy 数组的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55262766/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com