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