在python中将网格转换为棋盘图案?

时间:2016-06-28 18:34:52

标签: python python-2.7 python-3.x numpy matplotlib

我已经成功创建了一个网格,但现在我正在尝试将网格转换为棋盘图案,最好使用floodfill命令的变体。

如何确保程序识别哪个方格是偶数哪个是奇数?

目前IDE设置为m[i][j]= 1给出蓝色,而m[i][j]= 0给出红色,我很乐意保留,因此我不需要定义颜色。谢谢。

我到目前为止的代码:

from pylab import *
from numpy import *
from math import *

m=zeros((100,100))
for i in range(100):
    for j in range(100):
        if (math.floor(i) % 10) != 0:
            if (math.floor(j) % 10) != 0:
                m[i][j]= 1
            else:
                m[i][j]= 0

imshow(m)
show()

代码输出:

enter image description here

6 个答案:

答案 0 :(得分:1)

您可以检查两个索引(行和列)的总和,如果它是奇数,则用第一种颜色着色,否则为第二种颜色。类似的东西:

for i in range(nrows):
    for j in range(ncols):
        m[i][j] = 0 if (i+j)%2 else 1

答案 1 :(得分:0)

使用模数运算:

m[i][j] = (i+j) % 2

答案 2 :(得分:0)

我会创建一个线性数组,填充每秒值并重新整形。 在您的情况下(甚至是列数),在重新整形后添加一列并删除它:

import numpy as np

rows = 100
cols = 100 + 1  # product of rows*cols must be odd, we fix it later
m = np.zeros((rows*cols, 1))  # create array
m[::2] = 1  # fill every second
m = np.reshape(m, (rows, cols))  # reshape array to matrix
m = m[:, :-1]  # cut additional column

答案 3 :(得分:0)

您可以使用NumPy创建棋盘格样式数组,然后使用scipy's imresize调整其大小,使其等于所需的画布区域。

因此,步骤将是:

1)创建一个与(10,10)大小的棋盘图案对应的形状10 x 10的NumPy数组。为此,请从zeros数组开始,并使用ones填充备用行和列:

arr = np.zeros((10,10),dtype=int)
arr[::2,::2] = 1
arr[1::2,1::2] = 1

2)调整数组10x的大小,使其具有(100,100)像素大小的输出图像:

from scipy.misc import imresize # Importing required function

out = imresize(arr,10*np.array(arr.shape),interp='nearest')/255

输出:

enter image description here

答案 4 :(得分:0)

只需对代码进行最少的修改,就会看起来像这样:

from pylab import *
from numpy import *
from math import *

m=zeros((100,100))
for i in range(100):
    for j in range(100):
        if (math.floor(i) % 10) != 0:
            if (math.floor(j) % 10) != 0:
                m[i][j]= 1
        if (int(i / 10) + int(j / 10)) % 2:  # the only two extra lines. 
            m[i][j] = 0                      #
imshow(m)
show()

或者只是这个(假设你真的需要100x100)来摆脱“边界线”:

m=zeros((100,100))
for i in range(100):
    for j in range(100):
        m[i][j] = (int(i / 10) + int(j / 10)) % 2

干杯。

答案 5 :(得分:0)

import numpy as np
def make_checkerboard(n_rows, n_columns, square_size):

    n_rows_, n_columns_ = int(n_rows/square_size + 1), int(n_columns/square_size + 1)
    rows_grid, columns_grid = np.meshgrid(range(n_rows_), range(n_columns_), indexing='ij')
    high_res_checkerboard = np.mod(rows_grid, 2) + np.mod(columns_grid, 2) == 1
    square = np.ones((square_size,square_size))
    checkerboard = np.kron(high_res_checkerboard, square)[:n_rows,:n_columns]

    return checkerboard


square_size = 5
n_rows = 14
n_columns = 67
checkerboard = make_checkerboard(n_rows, n_columns, square_size)

generated checkerboard