2012-08-16 40 views
1

我使用numpy 1.6和matplotlib 1.1.1,試圖從我有的標量字段生成速度場。到目前爲止,我生成我的標量數據這樣:numpy數組漸變和matplotlib顫動的倒序order

num_samples = 50 
    dim_x = np.linspace(self.min_x, self.max_x,num_samples) 
    dim_y = np.linspace(self.min_y, self.max_y,num_samples) 
    X, Y = np.meshgrid(dim_x, dim_y) 

    len_x = len(dim_x) 
    len_y = len(dim_y) 

    a = np.zeros([len_x, len_y], dtype=float) 
    for i, y in enumerate(dim_y): 
     for j, x in enumerate(dim_x): 
      a[i][j] = x*y # not exactly my function, just an example 

然後我得到的梯度:

(velx,vely) = np.gradient(a) 

從numpy的文檔,velx是x分量和vely是y分量矢量字段。檢查matplotlib的文檔,我使用箭頭來繪製矢量字段。它指出velx和vely是矢量場的x分量和y分量:

fig0 = plt.figure() 
    ax = fig0.add_subplot(111) 
    Q = ax.quiver(X,Y, velx, vely) 
    plt.show() 

這給出錯誤的結果爲速度場:

Wrong result for the scalar field

曲線圖的唯一方式看起來確定是,如果我在反轉顫動的組件:

Q = ax.quiver(X,Y, vely, velx)#WHY??? 

Right result with the "wrong" expression

我懷疑這是像行或列排序的東西,但我無法弄清楚,如果np.gradient的輸出是反轉的,或者如果顫動反轉。所有一維問題都按預期工作。謝謝!

編輯:只是爲了更清楚這是怎麼倒,功能

a[i][j] = x*y 

改變

a[i][j] = x*x 

梯度應該是在x方向,隨着x的增加不斷增加。結果仍然是錯誤的:如果我使用

Q = ax.quiver(X,Y, velx, vely) 

我得到

Still wrong

,如果我倒轉

Q = ax.quiver(X,Y, vely, velx) 

我得到

Right

也許有更pythonic(和正確!)的方式來做到這一點...

回答

1

我認爲你是對的,(這是一個數組排序問題)。 a內置爲a[yidx,xidx],但是當您使用漸變時,您應該:velx, vely = np.gradient(a)當您應該做vely, velx = np.gradient(a)時。由於沿着第0軸的梯度應該給你vely(推測是d/dy(a) = vely)? - 除非我錯過了一些東西(在這種情況下,我會愉快地刪除這個答案)。

另外請注意,我想你可以建立「a」沒有嵌套列表:

a = X*Y 

應爲更復雜的功能以及工作...

+0

感謝您的回答!你能解釋我是如何建立我的數組作爲[yidx,xidx]?我認爲,第二個索引j是針對該行的,所以x值,反之亦然?如果你是對的他們,我應該顛倒循環中的順序,但是這會給輪廓和輪廓帶來問題... – Ivan 2012-08-16 19:16:31

+0

@Ivan - 簡單。在循環中,迭代'dim_y'時返回'i',迭代中'dim_x'返回'j'。然後你將這些元素打包爲'a [i,j]'。我錯過了什麼(這完全有可能)。 – mgilson 2012-08-16 19:20:07

+0

你是完全正確的。我正在對元素的順序做出巨大的混淆。我完全被x == i或y == j所迷惑。 – Ivan 2012-08-16 20:04:15