Python 引用数组的条件随机元素并替换它

Python 引用数组的条件随机元素并替换它,python,arrays,numpy,random,Python,Arrays,Numpy,Random,这是我关于StackOverflow的第二个问题,与Python/Numpy中的编码有关 我觉得肯定有某种函数可以执行伪代码: np.random.choice([a[i-1,j],a[i+1,j],a[i,j-1],a[i,j+1]])==0 = 9 基本上,我希望随机函数选择一个与我相邻的单元格(上、下、左、右),其值为0,并用9替换所述单元格 不幸的是,我知道为什么我键入的代码是非法的。语句的前半部分返回真/假布尔值,因为我使用了比较/检查运算符。我无法将其设置为值9 如果我将代码负载分

这是我关于StackOverflow的第二个问题,与Python/Numpy中的编码有关

我觉得肯定有某种函数可以执行伪代码:

np.random.choice([a[i-1,j],a[i+1,j],a[i,j-1],a[i,j+1]])==0 = 9
基本上,我希望随机函数选择一个与我相邻的单元格(上、下、左、右),其值为0,并用9替换所述单元格

不幸的是,我知道为什么我键入的代码是非法的。语句的前半部分返回真/假布尔值,因为我使用了比较/检查运算符。我无法将其设置为值9

如果我将代码负载分成两个代码,并使用带有random.choice的If语句(查看等于零的相邻元素),那么接下来,我需要某种函数或定义来回忆随机生成器最初选择的单元格(上下左或右),然后我可以将其设置为9

亲切问候,

编辑:我也可以附加一个示例代码,这样您就可以简单地运行它(我包括我的错误)


可以从一系列方向(上、下、左、右)中进行选择,这些方向映射到二维阵列中的特定坐标移动,如下所示:

# generate a dataset
a = np.zeros((6,6))
a[2,3]=a[3,3]=a[2,4] = 1

# map directions to coordinate movements
nesw_map = {'left': [-1, 0], 'top': [0, 1], 'right': [1,0], 'bottom': [0,-1]}
directions = nesw_map.keys()

# select only those places where a == 1
for col_ind, row_ind in zip(*np.where(a == 1)):  # more efficient than iterating over the entire array
    x = np.random.choice(directions)
    elm_coords = col_ind + nesw_map[x][0], row_ind + nesw_map[x][1]
    if a[elm_coords] == 0:
        a[elm_coords] = 9
请注意,这不会执行任何类型的边界检查(因此,如果边缘出现
1
,您可能会选择一个“脱离网格”的项目,这将导致错误)。

这是获取所需内容的最“基本”方法(添加
try/except
语句可提供错误检查,因此您可以防止任何不必要的错误):


再次感谢您的输入!我对字典和键不太熟悉,但你的例子确实澄清了这一点!我有几个问题:我不理解zip(*np.where())函数是如何运行的。为什么where函数本身就不够用?@kevenren,
np.where
将返回与数组中维度数量相同的列表。因此,2D数组
a==1
上的
where
将返回2个列表,每个列表分别包含沿第一轴和第二轴的索引,其中条件
a==1
为真。让我们调用这些列表
行索引
列索引
。现在,在循环中,您只需要查看这两个数组中的每一对元素。因此,您需要组合这两个阵列,类似于拉链的工作方式。试着在一个互动会话中建立这条线,看看会发生什么;在我看来,一个直观的例子更好地解释了这一点。谢谢。这是非常有用的。星号将单个数组分隔为元组,zip将它们配对。感谢您的输入!我想知道“try”的功能是什么。这是否等同于有一个if语句和一个更大的else语句?@kevenren,当算法在矩阵的边缘(例如右边缘)找到一个
1
时,它可以防止索引器。在这种情况下,如果随机选择是3,
a[i,j+1]
将生成一个错误,因为您试图访问矩阵“外部”的元素。它可以被if-else语句替换,但在这种情况下,最好使用try-except,因为通常边缘元素的数量比元素总数小得多。看一看这张照片。
# generate a dataset
a = np.zeros((6,6))
a[2,3]=a[3,3]=a[2,4] = 1

# map directions to coordinate movements
nesw_map = {'left': [-1, 0], 'top': [0, 1], 'right': [1,0], 'bottom': [0,-1]}
directions = nesw_map.keys()

# select only those places where a == 1
for col_ind, row_ind in zip(*np.where(a == 1)):  # more efficient than iterating over the entire array
    x = np.random.choice(directions)
    elm_coords = col_ind + nesw_map[x][0], row_ind + nesw_map[x][1]
    if a[elm_coords] == 0:
        a[elm_coords] = 9
import random,numpy
a = numpy.empty((6,6,))
a[:] = 0
a[2,3]=a[3,3]=a[5,5] = 1

for (i,j), value in numpy.ndenumerate(a):
    var = 0
    if a[i,j]==1:
        while var==0:
            x=random.randrange(0,4)                   #Generate a random number
            try:      
                if x==0 and a[i-1,j]==0:              
                    a[i-1,j] =9                       #Do this if x = 0
                elif x==1 and a[i+1,j]==0:            
                    a[i+1,j] =9                       #Do this if x = 1
                elif x==2 and a[i,j-1]==0:             
                    a[i,j-1] =9                       #Do this if x = 2
                elif x==3 and a[i,j+1]==0:            
                    a[i,j+1] =9                       #Do this if x = 3
                var=1
            except:
                var=0

print a