如何用单个元素替换二维numpy数组中重复的连续元素

2024-04-25 02:17:36 发布

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

我有一个新的形状数组(1080960)

[[0 0 255 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 255 0 0]
 ...
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 255 255 ... 0 0 0]]

我想输出一个numpy数组,用一个0和一个255替换0和255的重复值

numpy数组是二进制图像的表示,它的像素形式为bbbwwwwwbbbbwww,其中B是黑色,W是白色。我想把它转换成bww。在

示例

输入:

^{pr2}$

输出:

[[0,255,0],
 [255,0,255]
 [0,255,0,255,0,255]]

Tags: 图像numpy示例二进制像素数组形式形状
2条回答

您可以迭代行并通过构建新数组对元素进行分组,同时检查最后一个元素并仅在差异时追加。在

功能如下:

def groupRow(row):
    newRow = [row[0]]
    for elem in row:
            if elem != newRow[-1]:
                    newRow.append(elem)
    return newRow

迭代并用该函数中的新行替换形状中的每一行

无法输出2D numpy数组,因为输出行的长度可能不同。我会接受一个numpy数组的列表。首先,让我们生成一些数据:

img = np.random.choice([0,255], size=(1080, 960))

然后迭代每一行:

^{pr2}$

通过获取差异,我们只需检测发生变化的位置,然后使用这些索引idx来选择一个连续的条纹中的起始元素。这个解决方案比@DavidWinder的解决方案(30毫秒vs.150毫秒)更简单、更快。在

完全矢量化的解决方案可能会更快一些,但代码会有点复杂。它将包括扁平化数组,散乱和分解索引。。。最后应用np.split,这不是一个非常快的操作,因为它涉及到创建一个列表。所以我认为这个答案在速度/代码简单性之间已经足够好了。在

编辑#1

如果首选输出是在末尾填充0的数组,则最好创建一个零数组并用outlist的值填充它。首先找出哪一行有更多元素,然后创建数组:

max_elms = np.max([len(x) for x in out])
arr = np.zeros((1080, max_elms), dtype=np.int32)

然后迭代out列表和arr,用out列表中的值填充arr的值:

for row, data in zip(arr, out):
    row[:len(data)] = data

相关问题 更多 >