从numpy数组中选择相邻元素

2024-04-29 19:22:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我用一个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],那么我期望返回的晶格是

^{pr2}$

编辑:我很抱歉之前对复数的错误用法。在


Tags: 数据方法numpy元素nprandomuniform数组
1条回答
网友
1楼 · 发布于 2024-04-29 19:22:15

使用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

结果:

^{pr2}$

相关问题 更多 >