2013-07-01 30 views
3

我想創建3D空間中的兩個點之間的連線:(NUM)Python的方式,使3D的網格線繪製

origin = np.array((0,0,0),'d') 
final = np.array((1,2,3),'d') 
delta = final-origin 
npts = 25 
points np.array([origin + i*delta for i in linspace(0,1,npts)]) 

但是,這是愚蠢的:我建立一個大蟒蛇列表,然後將它傳遞當我確信有一種方法可以單獨使用numpy來做到這一點。 numpy嚮導如何做這樣的事情?

回答

1

也許使用np.column_stack

In [71]: %timeit np.column_stack((np.linspace(o,f,npts) for o,f in zip(origin,final))) 
10000 loops, best of 3: 45 us per loop 

In [77]: %timeit np.array([origin + i*delta for i in np.linspace(0,1,npts)]) 
10000 loops, best of 3: 138 us per loop 

注:海梅的答案是更快:

In [92]: %timeit origin + (final-origin)*np.linspace(0, 1, npts)[:, np.newaxis] 
10000 loops, best of 3: 21.1 us per loop 
+0

第二次在一天裏你已經把我救了出來!這非常可愛,而且它永遠不會發生在我身上。謝謝! – Rick

3

可以破除所有的Python循環爲這一個用有點廣播:

origin + delta*np.linspace(0, 1, npts)[:, np.newaxis] 
+0

非常好!謝謝! – Rick

+0

@Rick:這比我的回答快。也許你應該接受這個。 – unutbu

+0

@unubtu僅適用於'npts'的小值。在我的系統中,'npts = 1000'在同一時間運行,'npts = 10000'的速度是你運行速度的兩倍。但是如果你重寫我的代碼爲'(origin [:, None] +(final-origin)[:, None] * np.linspace(0,1,npts))。每個'npts'的值都是你的兩倍。內存訪問的奧祕...... – Jaime