从numpy数组中选择相邻元素

时间:2014-03-07 11:09:20

标签: python arrays 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]])

编辑:我很抱歉以前误导了复数。

1 个答案:

答案 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]]