使用Python创建棋盘分布

6

我希望用Python创建一个棋盘分布。

目前,我使用以下脚本创建一个大小为2 x 2的棋盘:

import numpy as np
import matplotlib.pyplot as plt

n_points = 1000
n_classes = 2

x = np.random.uniform(-1,1, size=(n_points, n_classes))
mask = np.logical_or(np.logical_and(x[:,0] > 0.0, x[:,1] > 0.0), \
np.logical_and(x[:,0] < 0.0, x[:,1] < 0.0))
y = np.eye(n_classes)[1*mask]

plt.scatter(x[:,0], x[:,1], c=y[:,0], cmap="bwr", alpha=0.5)
plt.show()

这段代码创建了如下图片所示的棋盘分布:

enter image description here

我想知道是否存在一种简单的方法来将上述代码泛化,以创建大小为 n x n 的棋盘分布?

编辑

使用 @jpf 的精彩解决方案。

import numpy as np
import matplotlib.pyplot as plt
from numpy import sin

n_points = 10000
n_classes = 2
n = 8

x = np.random.uniform(-(n//2)*np.pi, (n//2)*np.pi, size=(n_points, n_classes))
mask = np.logical_or(np.logical_and(sin(x[:,0]) > 0.0, sin(x[:,1]) > 0.0), \
np.logical_and(sin(x[:,0]) < 0.0, sin(x[:,1]) < 0.0))
y = np.eye(n_classes)[1*mask]

plt.scatter(x[:,0], x[:,1], c=y[:,0], s=1, cmap="bwr", alpha=0.5)
plt.savefig("test.png", dpi=150)
plt.show()

我现在可以生成任意大小的棋盘分布:

enter image description here


mask_1 变量有什么用途? - rassar
@rassar 好观点!mask_1没有被使用。我会将其删除。 - Gilfoyle
1个回答

5

使用正弦等周期函数如何?

import numpy as np
import matplotlib.pyplot as plt
from numpy import sin

n_points = 10000
n_classes = 2

x = np.random.uniform(-10,10, size=(n_points, n_classes))
mask = np.logical_or(np.logical_and(sin(x[:,0]) > 0.0, sin(x[:,1]) > 0.0), \
np.logical_and(sin(x[:,0]) < 0.0, sin(x[:,1]) < 0.0))
y = np.eye(n_classes)[1*mask]

plt.scatter(x[:,0], x[:,1], c=y[:,0], cmap="bwr", alpha=0.5)
plt.show()

使用正弦函数来掩盖数组是一个绝妙的主意,但为了使它具有通用性(任何n x n),你需要控制sin函数的频率。你还没有做到这一点。 - Valentino
2
非常好的方法。我们可以使用类似于np.random.uniform(-n*np.pi,n*np.pi, size=(n_points, n_classes))而不是np.random.uniform(-10,10, size=(n_points, n_classes))来得到完美的边界。其中n是一个自然数。 - Gilfoyle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接