gpt4 book ai didi

python - "invert"一个数组,即将二维索引列表转换为一维索引的二维数组

转载 作者:太空宇宙 更新时间:2023-11-04 02:10:01 27 4
gpt4 key购买 nike

我想以最好的 numpythonic 方式解决的问题是:我有一个二维索引列表 A,例如:

A = [(0, 3), (2, 2), (3, 1)]

我的目标是现在得到一个数组

[[H H H 0],
[H H H H],
[H H 1 H],
[H 2 H H]]

其中 H 是一些默认值(例如 -1)所以问题通常是关于以这种方式反转数组。

如果 A 是单射的(没有值出现两次)我可以严格地说明:

令 A 为二维索引的单射数组。 然后,生成一个二维数组 B 使得 B[i, j] = A.index((i, j))

或者对于 A 不一定单射:

令 A 为二维索引的单射数组。 然后,生成一个二维数组 B 使得 A[B[i, j]] = (i, j)

更具体地说,在非单射情况下,我们可以通过附加的“决策者”函数来解决这种情况。说

A = [(0, 3), (2, 2), (3, 1), (0, 3)]

然后为了解决 (0, 3) 在位置 0 和 3 之间的冲突,我想将一些函数应用于等效索引以找到确定的值。

举个例子:在我的例子中,具体来说,我有第二个数组 C,其长度与 A 相同。如果 A 中有多个候选(2d 索引)用于最终二维数组中的一个“位置”,则所选的应该是 A 中的 1d 索引最小化 C 中的值的那个。

我希望这些例子能说明问题。感谢您的帮助。

编辑:更多示例:

    A = [(0, 3), (2, 2), (3, 1)]
print(my_dream_func(A, default=7)
>>> [[7 7 7 0],
[7 7 7 7],
[7 7 1 7],
[7 2 7 7]]

A = [(0, 3), (2, 2), (3, 1), (0, 3)]
print(my_dream_func(A, default=7))
>>> Err: an index appears twice

这种情况的替代方案:

    def resolveFunc(indices):
c = [0.5, 2.0, 3.4, -1.9]
return(np.argmin(c[indices]))

A = [(0, 3), (2, 2), (3, 1), (0, 3)]

print(my_dream_func(A, resolveFunc, default=7))
#now resolveFunc is executed on 0 and 3
#because 0.5 > -1.9, 3 is chosen as the value for (0, 3)
>>> [[7 7 7 3],
[7 7 7 7],
[7 7 1 7],
[7 2 7 7]]

最佳答案

我会这样做:

In [11]: A = np.array([(0, 3), (2, 2), (3, 1)])

In [12]: a = np.full((len(A), len(A)), 7) # here H = 7

In [13]: a
Out[13]:
array([[7, 7, 7, 7],
[7, 7, 7, 7],
[7, 7, 7, 7],
[7, 7, 7, 7]])

In [14]: a[A[:, 0], A[:, 1]] = np.arange(len(A))

In [15]: a
Out[15]:
array([[7, 7, 7, 0],
[7, 7, 7, 7],
[7, 7, 1, 7],
[7, 2, 7, 7]])

“决策者”功能是最后获胜。

如果你想选择不同的决策函数,你可以先指定/修改元组列表(和枚举),而不是尝试在 numpy 中做一些聪明的事情......

关于python - "invert"一个数组,即将二维索引列表转换为一维索引的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53892469/

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