我已经在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
它为所有满足条件的条目创建一个布尔掩码
invalid
,其中包含True
。然后,您可以使用此掩码将相应的值设置为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
关于python - 如何通过python沿已知长度的3D向量进行循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30706455/