numpy 更快的2D阵列生成

zysjyyx4  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(120)

我想要一种更快的方法来使用NumPy在Python中生成2D数组。我的代码使用了一个生成器:

h,w= img.shape[:2]
points= [[x-w/2,y-h/2,img[y,x]] for y in range(h) for x in range(w) if img[y,x]!=0]

如何使用Numpy更快?img是一个10x10的二维numpy.array。代码并不慢,但我需要重复336次。

kse8i1jr

kse8i1jr1#

设置示例数据:

import numpy as np
np.random.seed(10)
img = np.random.randint(0,10,(10,10))
h,w= img.shape
points= [[x-w/2,y-h/2,img[y,x]] for y in range(h) for x in range(w) if img[y,x]!=0]
points = np.array(points)

使用NumPy:

np_points = np.vstack([np.where(img != 0), img[img != 0].ravel()]).T[:,[1,0,2]] - [w/2 , h/2, 0]
assert np.array_equal(np_points,points), 'solutions are not equal'

差别不大。NumPy解决方案将受益于所有图像的矢量化计算。

%%timeit
for i in range(336):
  np_points = np.vstack([np.where(img != 0), img[img != 0].ravel()]).T[:,[1,0,2]] - [w/2 , h/2, 0]

输出:

100 loops, best of 3: 7.71 ms per loop
%%timeit
for i in range(336):
  points= [[x-w/2,y-h/2,img[y,x]] for y in range(h) for x in range(w) if img[y,x]!=0]

输出:

10 loops, best of 3: 25.6 ms per loop

相关问题