Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在随机2d数组中检查一行中的3_Python_Arrays_Python 2.7 - Fatal编程技术网

Python 在随机2d数组中检查一行中的3

Python 在随机2d数组中检查一行中的3,python,arrays,python-2.7,Python,Arrays,Python 2.7,好的,我已经写出了上面的代码来打印6(R)x5(C)矩阵板的2d阵列。板中的每个坐标都应该在每个循环上随机生成,这就是我想要的 现在,我很难理解如何检查三行匹配(仅垂直或水平),这样就不会出现像这样的随机板 我应该先创建电路板,然后先检查条件(一行三个)?或者在生成每一行\列时,我应该在条件中对其进行编码吗?是否有一个python模块我应该看看,它已经做了这些事情 编辑: 以下是一个不可接受的输出示例: import pprint, random pp = pprint.PrettyPrint

好的,我已经写出了上面的代码来打印6(R)x5(C)矩阵板的2d阵列。板中的每个坐标都应该在每个循环上随机生成,这就是我想要的

现在,我很难理解如何检查三行匹配(仅垂直或水平),这样就不会出现像这样的随机板

我应该先创建电路板,然后先检查条件(一行三个)?或者在生成每一行\列时,我应该在条件中对其进行编码吗?是否有一个python模块我应该看看,它已经做了这些事情

编辑:

以下是一个不可接受的输出示例:

import pprint, random

pp = pprint.PrettyPrinter(1)
grid = []
for x in range(6):
    orbs = [0, 1, 2, 3, 4, 5]
    random.shuffle(orbs)
    y_list = []
    for y in range(5):
        y_list.append(orbs[y])
    grid.append(y_list)

pp.pprint(grid)
这是一个可以接受的:

[[5, 2, 5, 2, 2],
 [5, 4, 1, 5, 2],
 [1, 1, 0, 5, 3],
 [4, 4, 4, 0, 1],
 [0, 5, 0, 0, 3],
 [5, 3, 4, 2, 5]]
我应该先创建电路板,然后先检查条件(一行三个)

是的,这听起来是最简单的方法

或者在生成每一行\列时,我应该在条件中对其进行编码吗

我不会!这将更加复杂

在numpy中

[[4, 1, 4, 4, 5],
 [1, 3, 0, 1, 4],
 [1, 5, 4, 4, 0],
 [5, 2, 0, 4, 3],
 [5, 4, 2, 1, 0],
 [0, 1, 5, 0, 4]]
您可以使用
numpy.where(a[:,:-2::==a[:,1::)&(a[:,:-2::==a[:,2::])
来获取运行开始的坐标

> a = np.array(
[[5, 2, 5, 2, 2],
 [5, 4, 1, 5, 2],
 [1, 1, 0, 5, 3],
 [4, 4, 4, 0, 1],
 [0, 5, 0, 0, 3],
 [5, 3, 4, 2, 5]])
> (a[:,:-2:] == a[:,1:-1:]) & (a[:,:-2:] == a[:,2::]) # start of horizontal runs
array([[False, False, False],
       [False, False, False],
       [False, False, False],
       [ True, False, False],
       [False, False, False],
       [False, False, False]], dtype=bool)
> (a[:-2:,:] == a[1:-1:,:]) & (a[:-2:,:] == a[2::,:]) # start of vertical runs
> (a[:-2:,:-2:] == a[1:-1:,1:-1:]) & (a[:-2:,:-2:] == a[2::,2::]) # start of diagonal runs
原件:

def validate(board):
    Hdiff = np.abs(np.diff(board))
    Vdiff = np.abs(np.diff(board.T))
    kernel = np.ones((1,2))
    test = convolve2d(Hdiff, kernel, 'valid')
    test2 = convolve2d(Vdiff, kernel, 'valid')
    x1,y1 =  np.nonzero(test == 0)
    y2,x2 =  np.nonzero(test2 == 0)

    if len(x1):
        board[x1,y1] = np.random.randint(0, 5, len(x1))
    if len(x2):
        board[x2,y2] = np.random.randint(0, 5, len(x2))

    if len(x1) or len(x2):
        return validate(board)
    else:
        return board

myBoard = np.random.randint(0, 5, (6, 5))
myBoard[1,2:5] = [3, 3, 3]
myBoard[0:3, 0] = [1, 1, 1]
print myBoard
print validate(myBoard)
验证:

[[1 0 0 0 3]
 [1 3 3 3 3]
 [1 1 0 0 0]
 [1 3 4 4 1]
 [0 1 2 0 4]
 [2 3 2 3 1]]

使用卷积检测无效的行\列

range(0,6)
通常拼写为“range(6)”@Mike Graham。更新以反映这一点。考虑到以后的
random.choice
,洗牌是不必要的。看起来你的意思可以简单地说
[[random.randrange(6)for uuu.in range(5)]for uuu.in range(6)]
。有关搜索对角线的逻辑,请查阅
八皇后问题
,以获取python中的解决方案。至于你的问题,我会得到所有
0
s、所有
1
s等的坐标,并对每组数字进行自上而下的测试。(或
numpy.random.randint(0,5,(6,5))
[[4 4 0 0 3]
 [4 1 2 3 3]
 [1 1 2 0 0]
 [1 3 4 4 1]
 [0 1 2 0 4]
 [2 3 2 3 1]]