簡體   English   中英

塊替換編碼 numpy 二維數組

[英]Block replace coded numpy 2d array

我有一個用編碼部分構建的 numpy 數組。 這些部分以 2x2 塊的形式出現。 我有一本大字典,說明應該用什么來替換那些 2x2 塊。 如何用字典中的值替換那些 2x2 代碼。

info_dict = {
    5: np.array([[1, 0], [1, 0]], "int"),
    6: np.array([[1, 0], [0, 1]], "int"),
    7: np.array([[0, 1], [1, 0]], "int"),
    8: np.array([[1, 1], [0, 0]], "int"),
}
print(np.array([[5, 5, 8, 8], [5, 5, 8, 8], [6, 6, 7, 7], [6, 6, 7, 7]]))
print(np.array([[1, 0, 1, 1], [1, 0, 0, 0], [1, 0, 0, 1], [0, 1, 1, 0]]))
# before (coded)
[[5 5 8 8]
 [5 5 8 8]
 [6 6 7 7]
 [6 6 7 7]]
# after (final matrix)
[[1 0 1 1]
 [1 0 0 0]
 [1 0 0 1]
 [0 1 1 0]]

以供參考

#5
[[1 0]
 [1 0]]
#6
[[1 0]
 [0 1]]
#7
[[0 1]
 [1 0]]
#8
[[1 1]
 [0 0]]

一種方法:

import numpy as np

info_dict = {
    5: np.array([[1, 0], [1, 0]], "int"),
    6: np.array([[1, 0], [0, 1]], "int"),
    7: np.array([[0, 1], [1, 0]], "int"),
    8: np.array([[1, 1], [0, 0]], "int"),
}

a = np.array([[5, 5, 8, 8], [5, 5, 8, 8], [6, 6, 7, 7], [6, 6, 7, 7]])
np.block([[info_dict[b] for b in r] for r in a[::2, ::2]])

它給:

[[1 0 1 1]
 [1 0 0 0]
 [1 0 0 1]
 [0 1 1 0]]
a = np.array([[5, 5, 8, 8], [5, 5, 8, 8], [6, 6, 7, 7], [6, 6, 7, 7]])
b = np.array([[1, 0, 1, 1], [1, 0, 0, 0], [1, 0, 0, 1], [0, 1, 1, 0]])
sorted_values = b.ravel()[np.argsort(a.ravel())].reshape((-1, 2, 2))

現在, sorted_values是:

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

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

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

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

制作字典:

sorted_keys = sorted(np.unique(a))
info_dict = {key: value for key, value in zip(sorted_keys, sorted_values)}

假設您的字典中有少量整數,並且您的正方形是N一邊,您info_dict如下:

mapping = np.zeros((max(info_dict) + 1, N, N), dtype=int)
for channel, value in info_dict.items():
    mapping[channel] = value

如果您可以以這種格式存儲字典,那就更好了。 現在您可以使用簡單的索引和一些重新排列來獲得結果:

after = mapping[before[::N, ::N]].transpose(0, 2, 1, 3).reshape(before.shape)

暫無
暫無

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

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