問題。
假設我有以下陣列 tile1
[[80 80 80]
[80 80 80]
[80 80 80]
[80 80 80 ]]
我想用陣列[1 5 10]來替換每個[80 80]元素。我怎樣才能做到這一點呢?
我所嘗試的
我試過
print(tile1==[80,80, 80] )
我認為這很有用,但后來我發現這和
一樣print(tile1==80)
所以當我嘗試
時tile1[tile1==[80,80, 80]]=[1,5, 10]
當然,它失敗了。我只能根據基本元素來賦值,比如tile1[tile1==[80,80,80]]=5
uj5u.com熱心網友回復:
這些不是 "整個元素",它們是被稱為行的一大片記憶體。Numpy陣列與串列不同。串列存盤對嵌套元素的參考。Numpy陣列是記憶體塊。形狀和片斷代表了具有不同步長的視圖,而不是多層的指示。
您可以使用broadcasting向切片分配。在這種情況下,你需要指定一個索引,用一個布林值來標記所有包含你想要的元素的行,并告訴該索引來填充所有列。
你的替換陣列將被替換為一個包含所有元素的行。
你的替換陣列將正確地廣播到各列。然而,讓我們來看看這個索引。
tile1 == 80
這樣做的結果是,由于廣播的原因,陣列的形狀與tile1相同。==做了一個元素的比較。這也是:
tile1 == [80, 80, 80]
那么,你如何為每一行而不是每一個元素獲得一個布林值呢?你使用np.all沿著適當的軸:
np.all(tile1 == 80, axis=1)
或者我喜歡用方法版本來表述:
(tile1 == 80).all(axis=1)
而這就是它。所產生的掩碼有和tile1的行一樣多的元素,所以你可以像以前那樣直接使用它:
tile1[(tile1 == 80) 。 any(1) ] = [1, 5, 10]
這樣做的原因是,當你漏掉尾部的索引時,它們被隱含地設定為:或...。這是基本索引的一個標準特征。你正在將一個3元素的序列分配給一個(n, 3)形的索引。n是由掩碼中的True元素的數量決定的,而3是tile1的剩余維度的形狀。
uj5u.com熱心網友回復:
這可能是可行的,但需要一些測驗,我只是在檢查所有列的值是否相同。在這個例子中,它是80
arr = array([80, 80, 80],
[80, 80, 80] 。
[80, 80, 80] 。
[80, 80, 80]])
arr[arr.all(1)] = [1, 5, 10]/code>
array([[ 1, 5, 10]。
[1, 5, 10] 。
[1, 5, 10] 。
[1, 5, 10]])
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/321095.html
標籤:
上一篇:如何根據出現的次數來添加額外的列
