考慮變數“A”和一個包含多個嵌套陣列的陣列。“A”和嵌套陣列都包含相同數量的元素,在本例中為 5。每個嵌套陣列也以 3 個為一組嵌套在一起。
A=[10,20,30,40,50]
array=[[[1,5,8,3,4],[18,4,-8,4,21],[-8,12,42,16,-9]], ...]
我想知道如果嵌套陣列中元素的值超過某個閾值,如何將每個嵌套陣列中的元素替換為 A 中的相應元素。否則,如果元素未能超過閾值,則用零替換。
例如,如果此示例中的閾值為 10,則結果將是:
array=[[[0,0,0,0,0],[10,0,0,0,50],[0,20,30,40,0]], ...]
我知道這可能是一個簡單的問題,但我無法理解多維陣列,尤其是當它們大于二維時。更大的問題是,如果這些陣列嵌套在許多陣列下而不使用多個 for 回圈,我該怎么做?我的錯誤嘗試:
for a in array:
for x in a:
for i in x:
if a[i]>10:
a[i]=A[i]
else:
a[i]=0
uj5u.com熱心網友回復:
您的嘗試不起作用,因為首先您使用串列值i作為索引。在該行for i in x:中,變數i將獲取 list 的每個值x,如果您還需要它的索引,您可以使用for id, i in enumerate(x)which 為您提供 list 的每個值 asi及其索引 as id。
而且,要更新陣列,在回圈內部更新是不夠x的,需要直接更新陣列。當然,為了簡單起見,您可以在最后一個回圈中使用串列推導。因此,您的問題的解決方案可能如下所示:
for i1, val1 in enumerate(array):
for i2, val2 in enumerate(val1):
array[i1][i2] = [y if x>10 else 0 for (x, y) in zip(val2, A)]
至于您更大的問題,當您有多個嵌套串列并且您不想使用 for 回圈時,一般解決方案是實作遞回函式。
在這里,您的問題的一種遞回解決方案是:
def my_recursive_fun(input):
if isinstance(input, list) and isinstance(input[0], list):
return [my_recursive_fun(item) for item in input]
else:
return [y if x>10 else 0 for (x, y) in zip(input, [10,20,30,40,50])]
array=[[[1,5,8,3,4],[18,4,-8,4,21],[-8,12,42,16,-9]]]
new_array = my_recursive_fun(array)
遞回解決方案的好處是它可以在不更改代碼的情況下處理任意數量的嵌套串列(當然有限制)。
uj5u.com熱心網友回復:
如果您的陣列的嵌套是任意深度的,那么請使用遞回函式:
def apply_threshold(substitutes, limit, source):
if isinstance(source[0], list): # recursive case
return [apply_threshold(substitutes, limit, elem) for elem in source]
else: # base case
return [subst if value >= limit else 0
for subst, value in zip(substitutes, source)]
以下是如何使用它:
A = [10,20,30,40,50]
array = [[[1,5,8,3,4],[18,4,-8,4,21],[-8,12,42,16,-9]]]
result = apply_threshold(A, 10, array)
print(result) # [[[0, 0, 0, 0, 0], [10, 0, 0, 0, 50], [0, 20, 30, 40, 0]]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/489303.html
標籤:Python 数组 python-3.x 多维数组
