我有一個看起來像這樣的 3d 陣列,形狀為 (20001, 128, 128)
array([[[48, 48, 48, ..., 48, 48, 48],
[48, 48, 48, ..., 48, 48, 48],
[48, 48, 48, ..., 48, 48, 48],
...,
[[12, 12, 12, ..., 12, 12, 12],
[12, 12, 12, ..., 12, 12, 12],
[12, 12, 12, ..., 12, 12, 12],
...,
[19, 19, 19, ..., 12, 12, 12],
[19, 19, 19, ..., 19, 12, 12],
[19, 19, 19, ..., 19, 19, 19]],
我有一個看起來像這樣的字典
{1: [1, 39],
2: [2, 5, 9, 20, 32, 42, 47, 72, 88, 91, 95],
3: [3, 49, 55],
4: [4, 24, 34, 40, 53, 76, 81, 90, 96],
5: [6, 17, 30, 48, 83],
6: [7, 13, 15, 16, 27, 44, 51, 54, 56, 75],
7: [8, 50],
8: [10, 19, 22, 35, 61, 63, 65],
9: [11, 12, 21, 46, 52, 69, 78, 84, 89],
10: [14, 36, 74],
11: [18],
12: [23, 38, 66, 97],
13: [25],
14: [26, 28, 29, 62, 64, 86, 94],
15: [31, 59, 85],
16: [33, 80],
17: [37, 45, 60],
18: [41, 92, 93],
19: [43, 77, 79, 82],
20: [57, 67],
21: [58],
22: [68],
23: [70],
24: [71],
25: [73, 87],
0: [0]}
那么我之后是如果陣列值= dict值將陣列值更改為鍵,就像這樣->
array([[[5, 5, 5, ..., 5, 5, 5],
[5, 5, 5, ..., 5, 5, 5],
[5, 5, 5, ..., 5, 5, 5],
...,
[9, 9, 9, ..., 9, 9, 9],
[9, 9, 9, ..., 9, 9, 9],
[9, 9, 9, ..., 9, 9, 9]],
...,
[8, 8, 8, ..., 9, 9, 9],
[8, 8, 8, ..., 8, 9, 9],
[8, 8, 8, ..., 8, 8, 8]],
因為 48 在鍵 5 中,12 在鍵 9 中等等
uj5u.com熱心網友回復:
你應該反轉你原來的字典:
lookup_dict = {1: [1, 39],
2: [2, 5, 9, 20, 32, 42, 47, 72, 88, 91, 95],
3: [3, 49, 55],
4: [4, 24, 34, 40, 53, 76, 81, 90, 96],
5: [6, 17, 30, 48, 83],
6: [7, 13, 15, 16, 27, 44, 51, 54, 56, 75],
7: [8, 50],
8: [10, 19, 22, 35, 61, 63, 65],
9: [11, 12, 21, 46, 52, 69, 78, 84, 89],
10: [14, 36, 74],
11: [18],
12: [23, 38, 66, 97],
13: [25],
14: [26, 28, 29, 62, 64, 86, 94],
15: [31, 59, 85],
16: [33, 80],
17: [37, 45, 60],
18: [41, 92, 93],
19: [43, 77, 79, 82],
20: [57, 67],
21: [58],
22: [68],
23: [70],
24: [71],
25: [73, 87],
0: [0]}
reversed_dict = {val: key for key, lst in lookup_dict.items() for val in lst}
現在,您可以遍歷輸入陣列并在從中查找后將每個專案設定在一個新陣列中reversed_dict,這已經比JRiggles 的答案更有效,因為您不需要遍歷所有串列來找到新的價值。
但是,如果您將 this 的值reversed_dict放入一個陣列中,這樣 dict 中的鍵就是陣列中的索引,那么您可以簡單地使用 numpy 的內置廣播功能來索引到陣列中并獲得正確形狀的結果. 我更喜歡這種方法,因為它更快:
max_index = max(reversed_dict.keys())
lookup_array = np.zeros((max_index 1,))
for k, v in reversed_dict.items():
lookup_array[k] = v
最后:
input_array = np.array([[[48, 48, 48, 48, 48, 48],
[48, 48, 48, 48, 48, 48],
[48, 48, 48, 48, 48, 48]],
[[12, 12, 12, 12, 12, 12],
[12, 12, 12, 12, 12, 12],
[12, 12, 12, 12, 12, 12]],
[[19, 19, 19, 12, 12, 12],
[19, 19, 19, 19, 12, 12],
[19, 19, 19, 19, 19, 19]]])
output_array = lookup_array[input_array]
這使:
array([[[5., 5., 5., 5., 5., 5.],
[5., 5., 5., 5., 5., 5.],
[5., 5., 5., 5., 5., 5.]],
[[9., 9., 9., 9., 9., 9.],
[9., 9., 9., 9., 9., 9.],
[9., 9., 9., 9., 9., 9.]],
[[8., 8., 8., 9., 9., 9.],
[8., 8., 8., 8., 9., 9.],
[8., 8., 8., 8., 8., 8.]]])
這種方法的優點是它適用于input_array任何形狀,而且速度非常快!.
三種方法的定時:
- JRiggles 的回答,
func1 - 從反向字典中查找值,
func2 - 索引到新的 numpy 陣列,
func3
import timeit
input_array = np.random.randint(0, max_index, (100, 100, 100))
def get_key(search_value):
for key, num_list in lookup_dict.items():
if search_value in num_list:
return key
def func1(arr):
arr = np.copy(arr)
for outer_lst in arr:
for sub_list in outer_lst:
for index, value in enumerate(sub_list):
new_val = get_key(value) # get the key from 'dict'
sub_list[index] = new_val # replace old subarray value
return arr
def func2(arr):
arr = np.copy(arr)
for outer_lst in arr:
for sub_list in outer_lst:
for index, value in enumerate(sub_list):
new_val = reversed_dict[value]
sub_list[index] = new_val
return arr
def func3(arr):
return lookup_array[arr]
t1 = timeit.timeit("func1(input_array)", globals=globals(), number=2)
print("t1 =", t1)
t2 = timeit.timeit("func2(input_array)", globals=globals(), number=2)
print("t2 =", t2)
t3 = timeit.timeit("func3(input_array)", globals=globals(), number=2)
print("t3 =", t3)
在我的電腦上,這給出了:
t1 = 25.02508409996517
t2 = 1.2259434000588953
t3 = 0.01203500002156943
換句話說,
- JRiggles 的方法比反轉字典和在反轉字典中查找值慢 20 倍
- JRiggles 的方法比創建陣列和使用 numpy 索引陣列慢2000倍。
這是一個測驗陣列,它包含的元素比輸入陣列少約 300 倍。使用您的陣列,節省的時間將大大增加。
uj5u.com熱心網友回復:
arr = [ # Example list of lists - arbitrary values
[11, 11, 12, 13],
[24, 24, 24, 35],
[16, 27, 27, 8]
]
dictionary = {
1: [1, 39],
2: [2, 5, 9, 20, 32, 42, 47, 72, 88, 91, 95],
3: [3, 49, 55],
4: [4, 24, 34, 40, 53, 76, 81, 90, 96],
5: [6, 17, 30, 48, 83],
6: [7, 13, 15, 16, 27, 44, 51, 54, 56, 75],
7: [8, 50],
8: [10, 19, 22, 35, 61, 63, 65],
9: [11, 12, 21, 46, 52, 69, 78, 84, 89],
10: [14, 36, 74],
11: [18],
12: [23, 38, 66, 97],
13: [25],
14: [26, 28, 29, 62, 64, 86, 94],
15: [31, 59, 85],
16: [33, 80],
17: [37, 45, 60],
18: [41, 92, 93],
19: [43, 77, 79, 82],
20: [57, 67],
21: [58],
22: [68],
23: [70],
24: [71],
25: [73, 87],
0: [0]
}
def get_key(search_value):
for key, num_list in dictionary.items():
if search_value in num_list:
return key
for sub_list in arr:
for index, value in enumerate(sub_list):
new_val = get_key(value) # get the key from 'dict'
sub_list[index] = new_val # replace old subarray value
print(arr) # QED - see new array below
# [
# [9, 9, 9, 6],
# [4, 4, 4, 8],
# [6, 6, 6, 7]
# ]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/476890.html
上一篇:將輸入值傳遞給asp-route
