[英]"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.