2010-11-11 61 views
6

我現在正在處理模型輸出,而且我似乎無法想出將兩個數據數組組合的好方法。數組A和B存儲不同的數據,每個數據中的條目對應於某個空間(x,y)點 - A保存某個參數,B保存模型輸出。問題是B是A的空間分部 - 也就是說,如果模型是針對整個世界的,則A將在地球上的每個點處存儲參數,並且B將僅存儲非洲的那些點的模型輸出。兩個二維數組在哪裏開始相互重疊?

所以我需要找到有多少B從A偏移 - 換句話說,我需要找到他們開始重疊的索引。因此,如果A.shape =(1000,1500),B是(750:850,200:300)部分還是(783:835,427:440)子部分?我有與A和B相關的數組,這些數組存儲每個網格點的(x,y)位置。

這似乎是一個簡單的問題 - 找到兩個陣列重疊的地方。我可以用scipy.spatial的KDTree來解決它,但它非常緩慢。任何人有更好的想法?

+1

這個問題的答案真的取決於你有的網格類型。它是一個等距的笛卡爾網格嗎? – 2010-11-11 09:07:02

+1

對於A和B的網格點的位置,座標是否在水平和垂直方向上升?如果是這樣,那麼只需做一些二進制搜索。 – 2010-11-13 03:57:42

+0

如果這是全球氣候圖,B是否與非洲等地理區域相對應(即形狀不完全是矩形)還是隻是一個矩形子區域? – 2010-11-22 19:40:45

回答

1

我有陣列與A和B相關聯,它們存儲每個網格點的(x,y)位置。

在這種情況下,答案應該是相當簡單的...

是兩個網格嚴格在同一網格化方案?假如是這樣,你可以這樣做:

np.argwhere((Ax == Bx.min()) & (Ay == By.min())) 

假設兩個網格的世界座標增加在相同的方向網格的indicies,這給子集化的網格的左下角。 (如果他們沒有在同一方向(即負dxdy)增加,它只是給對方一個角)

在下面的例子中,我們可以明顯纔算從ix = (Bxmin - Axmin)/dx等適當indicies ,但假設你有一個更復雜的網格系統,這仍然有效。但是,這是假定兩個網格處於相同的網格方案!它稍微複雜,如果他們不...

import numpy as np 

# Generate grids of coordinates from a min, max, and spacing 
dx, dy = 0.5, 0.5 

# For the larger grid... 
Axmin, Axmax = -180, 180 
Aymin, Aymax = -90, 90 

# For the smaller grid... 
Bxmin, Bxmax = -5, 10 
Bymin, Bymax = 30, 40 

# Generate the indicies on a 2D grid 
Ax = np.arange(Axmin, Axmax+dx, dx) 
Ay = np.arange(Aymin, Aymax+dy, dy) 
Ax, Ay = np.meshgrid(Ax, Ay) 

Bx = np.arange(Bxmin, Bxmax+dx, dx) 
By = np.arange(Bymin, Bymax+dy, dy) 
Bx, By = np.meshgrid(Bx, By) 

# Find the corner of where the two grids overlap... 
ix, iy = np.argwhere((Ax == Bxmin) & (Ay == Bymin))[0] 

# Assert that the coordinates are identical. 
assert np.all(Ax[ix:ix+Bx.shape[0], iy:iy+Bx.shape[1]] == Bx) 
assert np.all(Ay[ix:ix+Bx.shape[0], iy:iy+Bx.shape[1]] == By) 
+0

哦,那很簡單!謝謝! – BernardShaw 2010-11-28 23:11:29

0

你能說更多嗎?你使用什麼模型?你在建模什麼?它是如何計算的?

你可以使尺寸匹配,以避免適合? (即,如果B不依賴於A的全部,則只插入A模型的B部分,或者計算B不會與A重疊並且稍後丟棄這些值的部分的鑽孔值)

+0

這是一個全球氣候模型。 「A」存儲每個網格單元的速度已經旋轉了多少(無論出於何種原因),「B」是實際速度。數組的大小和位置對於我的所有分析都是相同的,所以我只需要確定一次重疊。正如我提到的那樣,我以一種強力的方式解決了這個問題,這對我需要做的事情起作用。所以在這一點上,它更多的是一個抽象的智力練習:如何計算一個網格作爲另一個網格與原始網格重疊的位置? – BernardShaw 2010-11-11 04:46:56

0

我需要找到他們開始重疊的索引

那麼你是從A還是從B尋找索引? B是嚴格矩形的嗎?

找到B的邊界框或凸包真的很便宜。