我使用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()
這給出錯誤的結果爲速度場:
曲線圖的唯一方式看起來確定是,如果我在反轉顫動的組件:
Q = ax.quiver(X,Y, vely, velx)#WHY???
我懷疑這是像行或列排序的東西,但我無法弄清楚,如果np.gradient的輸出是反轉的,或者如果顫動反轉。所有一維問題都按預期工作。謝謝!
編輯:只是爲了更清楚這是怎麼倒,功能
a[i][j] = x*y
改變
a[i][j] = x*x
梯度應該是在x方向,隨着x的增加不斷增加。結果仍然是錯誤的:如果我使用
Q = ax.quiver(X,Y, velx, vely)
我得到
,如果我倒轉
Q = ax.quiver(X,Y, vely, velx)
我得到
也許有更pythonic(和正確!)的方式來做到這一點...
感謝您的回答!你能解釋我是如何建立我的數組作爲[yidx,xidx]?我認爲,第二個索引j是針對該行的,所以x值,反之亦然?如果你是對的他們,我應該顛倒循環中的順序,但是這會給輪廓和輪廓帶來問題... – Ivan 2012-08-16 19:16:31
@Ivan - 簡單。在循環中,迭代'dim_y'時返回'i',迭代中'dim_x'返回'j'。然後你將這些元素打包爲'a [i,j]'。我錯過了什麼(這完全有可能)。 – mgilson 2012-08-16 19:20:07
你是完全正確的。我正在對元素的順序做出巨大的混淆。我完全被x == i或y == j所迷惑。 – Ivan 2012-08-16 20:04:15