我目前正在处理一个相当大的3D点数据集(x,y,z),并想要一种有效的方法来识别xy平面中一组圆内的哪些点,半径为r和中心(x1,y1) ),其中x1和y1是网格坐标(每个长度为120)。圆圈将重叠,某些点将属于多个圆圈。
因此,输出将是14400个圆(120 * 120)的标识,并且(x,y,z)列表中的哪个点在每个圆中。
import numpy as np
def inside_circle(x, y, x0, y0, r):
return (x - x0)*(x - x0) + (y - y0)*(y - y0) < r*r
x = np.random.random_sample((10000,))
y = np.random.random_sample((10000,))
x0 = np.linspace(min(x),max(x),120)
y0 = np.linspace(min(y),max(y),120)
idx = np.zeros((14400,10000))
r = 2
count = 0
for i in range(0,120):
for j in range(0,120):
idx[count,:] = inside_circle(x,y,x0[i],y0[j],r)
count = count + 1
其中inside_circle是一个函数,它为半径为r的圆中的每个测试点x,y,z给出一个布尔值为True或False的数组,其中心为x0 [i]和x0 [j]
我的主要问题是,是否有一种比嵌套for循环更有效的方法?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
这个使用数组广播,比嵌套的for循环稍快(在我的机器上0.5s vs 0.8s)。在我看来,可读性有所下降。
import numpy as np
x = np.random.random_sample((1, 10000))
y = np.random.random_sample((1, 10000))
x0 = np.reshape(np.linspace(np.min(x),np.max(x),120), (120, 1))
y0 = np.reshape(np.linspace(np.min(y),np.max(y),120), (120, 1))
r = 2
all_xdiffssquared = np.subtract(x, x0)**2
all_ydiffssquared = np.subtract(y, y0)**2
all_xdiffssquared_3d = np.reshape(all_xdiffssquared, (120, 10000, 1))
all_ydiffssquared_3d = np.reshape(np.transpose(all_ydiffssquared), (1, 10000, 120))
all_distances_3d = all_xdiffssquared_3d + all_ydiffssquared_3d - r**2
idx = np.signbit(np.reshape(np.moveaxis(all_distances_3d, 1, -1), (14400, 10000)))