2015-06-08 18 views
2

我已經在3D平面上完成了一個點過濾程序,但是我需要沿已知長度的已知3D法向矢量進行循環。非常感謝您的幫助。如何沿着已知長度的3D矢量進行循環python

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 
+0

什麼是「STA」和「斧頭」?你已經在開始時將numpy定義爲np,然後在代碼中使用'numpy'。 –

+1

正如我所說的,sta是一個包含起始3D點的數組,是一個圓的中心。 Ax是包含法向量的數組。 –

+0

您是否曾經兩次使用len(xx)?直覺上,我會建議使用len(yy)和len(xx) – Moritz

回答

2

由於您使用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 
+0

是的,但我的問題是如何做到這一點沿着一個3d矢量循環。我非常努力。 –

+0

@linneo對不起,但重複你在問題標題中已經說過兩次的內容,而你的實際「問題」不能幫助我幫助你......我向你展示了「正確」的方式來做你在做的事情你的循環結構。如果這不是您需要的,請提供有關您的問題的更多信息。例如:你想要循環哪個矢量?你談論的長度在哪裏?你想在循環中產生什麼?你想完成什麼?具有期望輸出的工作代碼示例也將是整潔的... – swenzel