我有一个2D 32 x 32环形网格世界。一只蚂蚁可以走遍世界,当到达边缘时,蚂蚁环绕着世界的另一边。当我使用Matplotlib绘制此路径时:
path = [(0, 1), (0, 2), (0, 3), (31, 3), (31, 2), (31, 1), (0, 1), (0, 2),\
(31, 2), (30, 2), (30, 3), (30, 4), (30, 5), (29, 5)]
ys_path, xs_path = np.array(path).T
axes.plot(xs_path, ys_path, '-')
每当蚂蚁缠绕到另一边时,我会得到水平线和垂直线。知道我怎么不能通过世界的中间连接点?在图像中,红色圆圈是蚂蚁经过的所有方格。
如果连续之间的差值的绝对值是31,那么在那个位置插入(np.nan,np.nan)....但我不知道该怎么做。
self.path excerpt:
array([[ 0, 1],
[ 0, 1],
[ 31, 0], # at this point in path insert a np.nan tuple
[ 0, -1],
[ 0, -1],
[-31, 0],
[ 0, 1],
[ 31, 0],
[ -1, 0],
[ 0, 1],
[ 0, 1],
[ 0, 1],
[ -1, 0]])
path = np.array(self.path, dtype=np.float)
path = np.insert(path,
np.nonzero(np.abs(np.diff(path, axis=0)) > 1)[0] + 1, np.nan, axis=0)
ys_path, xs_path = np.array(path).T #flip i and j for coordinate system
axes.plot(xs_path+0.5, ys_path+0.5, '-') # centre in middle of square
这就是我们想要的,它在路径数组中插入一个NaN元组,Genius!
看起来你正在寻找np.insert
。它完全符合你的要求。您可以使用diff
获取np.nonzero
返回+/- 1以外的位置的索引。第一个返回值将是行索引,无论中断发生在哪个方向。由于insert
假设您在插入点之后指定索引,因此diff中的索引必须加1:
path = np.array([(0, 1), (0, 2), (0, 3), (31, 3), (31, 2), (31, 1), (0, 1), (0, 2),
(31, 2), (30, 2), (30, 3), (30, 4), (30, 5), (29, 5)], dtype=np.float)
delta = np.diff(path, axis=0)
mask = (np.abs(delta) > 1)
row_indices = np.nonzero(mask)[0]
row_indices += 1
path = np.insert(path, row_indices, np.nan, axis=0)
...
axes.plot(*path.T, '-')
此代码为每个步骤保存一个临时变量,以使其更容易理解。当然,根据您的需求和审美偏好,您可以将其转换为单线或中间的内容:
path = np.array([(0, 1), (0, 2), (0, 3), (31, 3), (31, 2), (31, 1), (0, 1), (0, 2),
(31, 2), (30, 2), (30, 3), (30, 4), (30, 5), (29, 5)], dtype=np.float)
path = np.insert(path, np.nonzero(np.abs(np.diff(path, axis=0)) > 1)[0] + 1, np.nan, axis=0)
...
axes.plot(*path.T, '-')
根据您计划以后如何使用path
,可能没有必要将它拆分为永久转置它。您可以使用参数扩展将其作为两个单独的数组传递给axes.plot
。