首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >np.array of points to np.array of segments

np.array of points to np.array of segments
EN

Stack Overflow用户
提问于 2020-08-09 16:02:24
回答 1查看 70关注 0票数 1

我有以下工作代码来将单个点投影到数组中的每个段。但我希望一组点中的每个点都投影到每个段上。

代码语言:javascript
复制
import numpy as np

#find closest segment to single point
  
#line segment
l1 = np.array([[2,3,0],[7,5,0]])   
l2 = np.array([[5,1,0],[8,6,0]])
#point that gets projected
p = np.array([[6,5,0]]) #only single point

#set to origin
line = l2-l1
pv = p-l1  

#length of line squared
len_sq = np.sum(line**2, axis = 1) #len_sq = numpy.einsum("ij,ij->i", line, line)

#dot product of 3D vectors with einsum
dot = np.einsum('ij,ij->i',line,pv) #np.sum(line*pv,axis=1)


#percentage of line the pv vector travels in
param = np.array([dot/len_sq])

#param<0 projected point=l1, param>1 pp=l2
clamped_param = np.clip(param,0,1)

#add line fraction to l1 to get projected point
pp = l1+(clamped_param.T*line)

例如,make

代码语言:javascript
复制
p = np.array([[6,5,0],[3,2,0]]) #multiple points

并返回4个投影点的np.array()。

EN

回答 1

Stack Overflow用户

发布于 2020-08-16 08:36:45

也许你可以尝试一下下面这样的方法。如果project是一个可以对单个点执行操作的函数,那么通过使用沿轴应用,您可以让它在一个点数组中的所有点上工作。输出作为每个点的单独生成器产生,这些生成器必须使用堆叠操作转换回单个数组。

代码语言:javascript
复制
l1 = np.array([[2,3,0],[7,5,0]])   
l2 = np.array([[5,1,0],[8,6,0]])
line = l2-l1
len_sq = np.sum(line**2, axis = 1)

def project(p):
    pv = p-l1
    dot = np.einsum('ij,ij->i',line,pv) 
    param = np.array([dot/len_sq])
    clamped_param = np.clip(param,0,1)
    yield l1+(clamped_param.T*line)
    

pts = np.array([[6,5,0],
                [3,2,0]])

gen = np.apply_along_axis(project, 1, pts)
out = np.hstack([list(G) for G in gen])[0]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63323937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档