gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:43:14 25 4
gpt4 key购买 nike

我有一个形状为(1080,960)的numpy数组

[[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 数组是二进制图像的表示,其像素格式为 BBBWWWWWWWWBBBBWWW,其中 B 为黑色,W 为白色。我想将其转换为 BWBW。

示例:

输入:

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

输出:

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

最佳答案

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

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

然后迭代每一行:

out=[]
for row in img:
idx=np.ediff1d(row, to_begin=1).nonzero()[0]
out.append(row[idx])

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

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

编辑#1

如果首选输出是末尾用 0 填充的数组,则最好创建一个 zeros 数组并用 out 列表的值填充它。首先找出哪一行元素较多,并创建数组:

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

关于python - 如何用单个元素替换二维 numpy 数组中重复的连续元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51669476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com