2016-09-27 111 views
3

我想問一下如何從網格生成相應的值。我有一個函數「foo」,它帶有一個長度爲2的一維數組,並返回一些實數。從網格數據生成數據(Numpy)

import numpy as np 

def foo(X): 
    #this function takes a vector, e.g., np.array([2,3]), and returns a real number. 
    return sum(X)**np.sin(sum(X)); 

x = np.arange(-2, 1, 1)   # points in the x axis 
y = np.arange(3, 8, 1)   # points in the y axis 
X, Y = np.meshgrid(x, y)   # X, Y : grid 

我使用meshgrid生成X和Y網格。那麼,如何使用「foo」函數生成相應的Z值,以便以3D形式繪製它們,例如使用plot_surface函數與X,Y,Z值進行繪圖?

這裏的問題是如何使用「foo」函數生成與X和Y形狀相同的Z值。由於我的「foo」函數只需要一維數組,我不知道如何使用X和Y的這個函數來生成相應的Z值。

+0

你想爲gridgrid中的每個點'(x,y)'指定'z = foo([x,y])'嗎? – Praveen

回答

2

使用np.dstack將「深度」中的兩個numpy陣列堆疊起來,然後修改foo函數,以便它僅在堆疊陣列的最後一個軸上運行。這是很容易使用np.sum與參數axis=-1做,而是採用了內置sum

import numpy as np 

def foo(xy): 
    return np.sum(xy, axis=-1) ** np.sin(np.sum(xy, axis=-1)) 

x = np.arange(-2, 1, 1)   # points in the x axis 
y = np.arange(3, 8, 1)   # points in the y axis 
X, Y = np.meshgrid(x, y)   # X, Y : grid 
XY = np.dstack((X, Y)) 

而現在,你應該得到:

>>> XY.shape 
(5, 3, 2) 
>>> foo(XY) 
array([[ 1.  , 1.87813065, 1.1677002 ], 
     [ 1.87813065, 1.1677002 , 0.35023496], 
     [ 1.1677002 , 0.35023496, 0.2136686 ], 
     [ 0.35023496, 0.2136686 , 0.60613935], 
     [ 0.2136686 , 0.60613935, 3.59102217]]) 

如果要達到同樣的效果,但沒有修改foo,那麼你可以使用np.apply_along_axis,它應該做你需要的:

>>> np.apply_along_axis(foo, -1, XY) 
array([[ 1.  , 1.87813065, 1.1677002 ], 
     [ 1.87813065, 1.1677002 , 0.35023496], 
     [ 1.1677002 , 0.35023496, 0.2136686 ], 
     [ 0.35023496, 0.2136686 , 0.60613935], 
     [ 0.2136686 , 0.60613935, 3.59102217]]) 
+0

感謝您的精彩解決方案。這正是我想要做的。但是,我有一些問題將這種方法應用於我的代碼塊。我實際上發佈了另一個關於這個問題的問題[鏈接](http://stackoverflow.com/questions/39715227/making-a-function-that-c​​an-take-arguments-in-various-shapes)。我的實際foo函數實際上就是'return X [0] + X [1];',所以它不能對嵌套數組執行迭代操作,只能採用(2,)的形式。因此,如果我將XY放入我的實際foo函數中,它會吐出我們的錯誤。在這種情況下,如何生成Z? –

+0

哎呀,對不起,我忘了! –

+0

順便說一句,如果我只是想使用我當前的foo函數,它只能使用(2,)形狀,你能告訴我該如何改變你的模式嗎? –