簡體   English   中英

“反轉”一個數組,即將二維索引列表轉換為一維索引的二維數組

[英]"invert" an array, i.e. convert list of 2d-indices into a 2d-array of 1d indices

我想以最好的 numpythonic 方式解決的問題是:我有一個 2d 索引的列表 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 之間的沖突,我想對等價索引應用一些函數來找到一個確定的值。

舉個例子:在我的例子中,具體來說,我有一個與 A 長度相同的第二個數組 C。如果 A 中有多個候選(二維索引)用於最終二維數組中的一個“位置”,則選擇的一個應該是 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 中做一些聰明的事情......

Numpy 支持同時將多個值分配給多個索引。 使用這種最numpythonic的方式來編寫你的函數是這樣的:

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 中有重復的索引,最后一個索引元組會覆蓋任何前輩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM