“反转”数组,即将二维索引列表转换为一维索引的二维数组

2024-10-01 07:41:16 发布

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

我想用一种更好的方法来解决的问题是: 我有一个2d索引列表,例如:

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是2d指数的内射数组。 然后,生成2d数组B,使得B[i,j]=a.index((i,j))

或者对于不一定是内射的:

设A是2d指数的内射数组。 然后,生成2d阵列B,使得a[B[i,j]=(i,j)

更具体地说,在非内射的情况下,我们可以用一个附加的“decider”函数来解决这个问题。 说

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

为了解决(0,3)在位置0和位置3之间的冲突,我想对等价索引应用一些函数来寻找一个定值。你知道吗

例如: 具体地说,在我的例子中,我有一个与a长度相同的第二个数组C。 如果在最终2d数组中的一个“位置”的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]]

Tags: 方法函数defaultindexismy情况数组
2条回答

Numpy支持同时将多个值分配给多个索引。 因此,使用这种最简单的方法编写函数将是:

import numpy as np

def f(idx, shape, default):
    arr = np.full(shape, default)
    arr[idx] = np.arange(0, len(idx))
    return arr

shape=(4,4)
default=7
idx=[(1,2),(0,3)]

print(f(idx, shape, default))

如果idx中存在重复的索引,则最后一个索引元组将覆盖任何前置索引。你知道吗

我会这样做:

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]])

“decider”功能是最后的胜利。你知道吗

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

相关问题 更多 >