蛇形扫描图形发生器

2024-05-08 01:18:15 发布

您现在位置:Python中文网/ 问答频道 /正文

太长,没有阅读

如何生成ndarray索引,以便对于每一新行,索引与上一个索引在同一列上继续。如下图所示,但对于n维数组。这有时被称为“蛇形”、“蛇形”或“之字形”扫描模式。 2D snake-style indexing

简介

np.ndindex(shape)生成该数组索引的迭代器,如:

>>> list(np.ndindex((3,3)))
[(0, 0), (0, 1), (0, 2), 
 (1, 0), (1, 1), (1, 2), 
 (2, 0), (2, 1), (2, 2)]

我希望生成相同的索引,但顺序是使下一个像素始终与前一个相邻。在当前形式中,ndindex从第一列开始,每一行都是新行。当当前行到达最后一列时,我希望它从同一列继续到下一行。我将其形象化为“蛇式”(在蛇游戏之后)索引(下面的代码片段*):

对于二维阵列,我可以通过每两行反转来实现这一点:

>>> shape = (3,3)
>>> A = list(np.ndindex(shape))
>>> A = np.reshape(A, shape + (len(shape), ))
>>> A[1::2] = A[1::2, ::-1]
>>> A.reshape((np.prod(shape), len(shape)))
[[0, 0], [0, 1], [0, 2], 
 [1, 2], [1, 1], [1, 0], 
 [2, 0], [2, 1], [2, 2]]

然而,当我尝试对一个三维矩阵这样做时,我遇到了问题。在这里,我使用了一种稍微不同的方法来简化绘图(使用单个索引)。你知道吗

3D Snake-style indexing

一个问题是,由于numpy切片表示法,似乎很难将其推广到n维数组。第二个问题是,对于三维数组,数组的第二个切片从底部开始,该行要么左右翻转,要么不翻转,这取决于该轴的大小是奇数还是偶数。你知道吗

有人有解决办法吗?你知道吗

**第二个数字的硬编码数组

data = np.array([
    [
        [0,1,2],
        [5,4,3],
        [6,7,8]],
    [
        [17,16,15],
        [12,13,14],
        [11,10,9]],
    [
        [18,19,20],
        [23,22,21],
        [24,25,26]]
])
fig, AX = plt.subplots(ncols=3)
for d, ax in zip(data, AX):
    ax.imshow(d, clim=(data.min(), data.max()), cmap='Greys')

Tags: datalennp切片数组axlistndarray
1条回答
网友
1楼 · 发布于 2024-05-08 01:18:15

这里有一种可能,即一次创建迭代器或整个数组:

import numpy as np

def zigzagiter(dims):
    N = len(dims)
    idx = N*[0]
    drc = N*[1]
    while True:
        yield (*idx,)
        for j in reversed(range(N)):
            if idx[j] + drc[j] not in (-1, dims[j]):
                idx[j] += drc[j]
                break
            drc[j] *= -1
        else:
            break

def zigzag(dims):
    r = np.arange(np.prod(dims))
    out = []
    for d in dims:
        out.append(np.abs((1|((d+r)<<1))%(d<<2)-(d<<1))>>1)
        r //= d
    return np.transpose(out[::-1])

演示:

>>> a = np.empty((3,3,3),int)
>>> a[tuple(zigzag((3,3,3)).T)] = np.arange(27)
>>> a
array([[[ 0,  1,  2],
        [ 5,  4,  3],
        [ 6,  7,  8]],

       [[17, 16, 15],
        [12, 13, 14],
        [11, 10,  9]],

       [[18, 19, 20],
        [23, 22, 21],
        [24, 25, 26]]])

相关问题 更多 >