gpt4 book ai didi

python - 如何有效地生成所有可能的坐标对而不在numpy中重复

转载 作者:太空宇宙 更新时间:2023-11-03 23:56:04 25 4
gpt4 key购买 nike

我正在尝试为具有颜色的图像中的像素生成所有坐标对,而不重复坐标对(顺序无关紧要,因此 ((1,1,1), (2,2,2) 是与 ((2,2,2), (1,1,1)) 相同,我们只想包含这对一次。对我来说,坐标存储在 numpy 数组中也很重要。

假设我有一张 10x10 的图片。这意味着图像有 100 个像素和 3 个颜色 channel ,相当于 300 个坐标。这给了我们 300*299/2 个唯一的坐标对。使用 itertools.combinations() 或普通的 python 迭代,然后转换为 np.array,对于更大的图像来说非常慢(在我的电脑上,32x32x3 图像需要 5 秒)。

我可以使用

创建所有像素的列表

all_pixels = np.array(np.meshgrid(range(10), range(10), range(3))).T.reshape(-1, 3)

但那是因为我们不必考虑重复。这样做但尝试创建像素对会给我重复项。我想我可以用一些聪明的方式删除重复项,但我不知道如何以有效的方式做到这一点。

任何帮助将不胜感激。

这有点粗糙,但作为引用,我现在是这样做的:

    start = time.time()
x, y, z = shape
all_pixels = []
for i in range(x):
for j in range(y):
if z > 1:
for k in range(z):
all_pixels.append([i, j, k])
else:
all_pixels.append([i, j])
first_pix = []
second_pix = []
for i in range(len(all_pixels)):
first = all_pixels[i]
for j in all_pixels[i+1:]:
second = j
first_pix.append(first)
second_pix.append(second)
print("generation of pixels took " + str(time.time() - start))
return np.array(first_pix), np.array(second_pix)

最佳答案

这是一个简单的 numpy 方法,不确定它有多快:

shape = 10,10,3
np.stack([*map(np.transpose, map(np.unravel_index, np.triu_indices(np.prod(shape),1), 2*(shape,)))],-2)

输出:

array([[[0, 0, 0],
[0, 0, 1]],

[[0, 0, 0],
[0, 0, 2]],

[[0, 0, 0],
[0, 1, 0]],

...,

[[9, 9, 0],
[9, 9, 1]],

[[9, 9, 0],
[9, 9, 2]],

[[9, 9, 1],
[9, 9, 2]]])

更新:相同的想法,相同的结果但更快

np.column_stack(np.unravel_index(np.arange(np.prod(shape)),shape))[np.column_stack(np.triu_indices(np.prod(shape),1))]

关于python - 如何有效地生成所有可能的坐标对而不在numpy中重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57670278/

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