我代表一个带有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]])
编辑:我很抱歉以前误导了复数。
答案 0 :(得分: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]]