如何使用python沿已知长度的3D向量进行循环

如何使用python沿已知长度的3D向量进行循环,python,Python,我在3D平面上做了一个点过滤程序,但我需要沿着已知长度的3D法向量做一个循环。非常感谢你的帮助 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D point = sta[10] #starting points normal = axe[10] #normal vector d = -point.dot(normal) # create x,y

我在3D平面上做了一个点过滤程序,但我需要沿着已知长度的3D法向量做一个循环。非常感谢你的帮助

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

point  = sta[10]    #starting points
normal = axe[10]    #normal vector

d = -point.dot(normal)

# create x,y
xx, yy = np.meshgrid(np.linspace(-3.,-2.,101), np.linspace(-11.,-10.,101))



# calculate corresponding z
z = (-normal[0] * xx - normal[1] * yy - d) * 1. /normal[2]
f=[]
for i in xrange(len(xx)-1):
    for j in xrange(len(xx)-1):
        if (xx[i][j]-sta[10][0])**2 + (yy[i][j]-sta[10][1])**2 + (z[i][j]-sta[10][2])**2 > float(rad[0])**2:
            xx[i][j]=NaN
            yy[i][j]=NaN
            z[i][j]=NaN

由于您正在使用meshgrid和
xx
yy
z
具有相同的形状,numpy的广播策略将自动满足您的需要。试试这个:

invalid = (xx-sta[10,0])**2 + (yy-sta[10,1])**2 + (z-sta[10,2])**2 > float(rad[0])**2
xx[invalid]=np.NaN
yy[invalid]=np.NaN
z[invalid]=np.NaN
它为满足条件的所有条目创建一个布尔掩码
无效
,其中包含
。然后,您可以使用此掩码将相应的值设置为
NaN

注意,可以使用元组索引numpy数组。也就是说,
myArray[a][b]
相当于
myArray[a,b]

还请注意,我假设您意外地排除了最后的条目。如果你是故意使用
xrange(len(xx)-1)
而不是
xrange(len(xx))
,它会变得更难看,你必须这样做:

invalid = (xx[:-1,:-1]-sta[10,0])**2 + (yy[:-1,:-1]-sta[10,1])**2 + (z[:-1,:-1]-sta[10,2])**2 > float(rad[0])**2
xx[:-1,:-1][invalid]=np.NaN
yy[:-1,:-1][invalid]=np.NaN
z[:-1,:-1][invalid]=np.NaN

什么是“sta”和“axe”?您在开始时将numpy定义为np,然后在代码中使用“numpy”。正如我所说,sta是一个包含起始3D点的数组,是圆心。Axe是一个包含法向量的数组。你有两次故意使用len(xx)吗?直觉上,我建议使用len(yy)和len(xx)是的,但我的问题是如何沿着三维向量循环。我对此感到很挣扎。@linneo我很抱歉,重复你在问题标题中已经说过两次的话,而你实际的“问题”对我帮不了你。。。我已经向您展示了在循环构造中执行操作的“正确”方法。如果这不是您需要的,请提供有关您的问题的更多信息。例如:您希望循环哪个向量?你说的长度是多少?在循环过程中,您希望生成什么?你到底想要实现什么?具有所需输出的工作代码示例也很简洁。。。