我已经在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,并且xxyyz具有相同的形状,因此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/

10-16 06:09