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