2014-03-07 139 views
1

我用一個numpy數組來表示一個直立的正方形網格(一個元素連接到上面的一個,下面的一個連接到右邊和左邊,但不是對角線)。我需要從網格中選擇一個隨機元素,並將其值更改爲隨機相鄰元素的值。有沒有簡單的方法來做到這一點?從numpy數組中選擇一個相鄰的元素

目前我最好的想法是從行和列索引隨機化,然後嘗試如果元素有四個鄰居,然後嘗試如果左側缺失,然後右側,然後頂部,然後底部,最後嘗試四角落。這看起來很麻煩。

我的數據是-1,+ 1隨機分佈在格:

lattice=np.random.uniform(low=0.0, high=1.0, size=[30,30]) 
lattice[lattice<0.2]=-1 
lattice[lattice>0.2]=1 

所以說隨機元是lattice[0,0],那麼我期待返回的格子是

lattice[0,0]=np.random.choice([lattice[0,1], lattice[1,0]]) 

編輯:我很抱歉以前誤導複數的使用。

+2

什麼是你的數據樣子?提供一些示例輸入和預期輸出plz – zhangxaochen

+0

您是否想要一次或一次對所有元素執行此操作? – YXD

回答

1

使用scipy.ndimage.generic_filter在每個元素周圍傳遞一個3x3的網格以達到我們選擇的功能。該功能選擇一個隨機相鄰元素。
邊界(原始數組外部的值)設置爲nan,並且我們在函數中過濾掉nan,所以我們只從有效元素中進行選擇。

import numpy as np 
import scipy.ndimage as ndimage 


def random_function(arr, **kwargs): 
    from random import choice 
    mask = ~np.isnan(arr) & kwargs['mask'] 
    return choice(arr[mask]) 

n = 5 
array = np.arange(n ** 2).reshape((n, n)) 
cross_mask = np.zeros(9).astype(bool) 
cross_mask[[1, 3, 5, 7]] = True 
res = ndimage.generic_filter(array, random_function, size=3, mode='constant', cval=np.nan, extra_keywords={'mask': cross_mask}) 
print array 
print res 

結果:

array: 
[[ 0 1 2 3 4] 
[ 5 6 7 8 9] 
[10 11 12 13 14] 
[15 16 17 18 19] 
[20 21 22 23 24]] 
res: 
[[ 1 6 7 8 3] 
[ 6 1 12 9 8] 
[11 10 7 8 9] 
[10 17 18 17 18] 
[15 20 21 18 19]] 
+0

這真的很有趣。我需要能夠將這個過濾器應用於隨機選擇的元素而不是整個數組。 –