[英]Combining two numpy arrays with equations based on both arrays
我有一個 python numpy 3x4 陣列 A:
A=np.array([[0,1,2,3],[4,5,6,7],[1,1,1,1]])
和一個 3x3 數組 B:
B=np.array([[1,1, 1],[2, 2, 2],[3,3,3]])
我正在嘗試使用 numpy 操作來生成數組 C ,其中 C 中的每個元素都基於使用 A 中的相應元素和 B 中的整個行的簡化示例:
C[row,col] = A[ro1,col] * ( A[row,col] / B[row,0] + B[row,1] + B[row,2) )
我的第一個想法是簡單地將所有 A 乘以 B 中的列。錯誤。
C = A * B[:,0]
然后我想試試這個,但沒有奏效。
C = A[:,:] * B[:,0]
我不確定如何使用“:”運算符並同時訪問特定行 col。 我可以在常規循環中執行此操作,但我想要更多的 numpy。
mport numpy as np
A=np.array([[0,1,2,3],[4,5,6,7],[1,1,1,1]])
B=np.array([[1,1, 1],[2, 2, 2],[3,3,3]])
C=np.zeros([3,4])
row,col = A.shape
print(A.shape)
print(A)
print(B.shape)
print(B)
print(C.shape)
print(C)
print(range(row-1))
for row in range(row):
for col in range(col):
C[row,col] = A[row,col] * (( A[row,col] / B[row,0]) + B[row,1] + B[row,2])
print(C)
哪個打印:
(3, 4)
[[0 1 2 3]
[4 5 6 7]
[1 1 1 1]]
(3, 3)
[[1 1 1]
[2 2 2]
[3 3 3]]
(3, 4)
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
range(0, 2)
[[ 0. 3. 8. 15. ]
[24. 32.5 42. 0. ]
[ 6.33333333 6.33333333 0. 0. ]]
有更好的方法建議嗎? 編輯:現在我對廣播有了更多的了解,並讓代碼運行起來,讓我以通用的方式擴展我想要解決的問題。 我正在嘗試 map 類別的值,例如“空氣”,它可以是必須映射到給定 RGB 值的陰影的范圍(例如 0-5)。 這些值是在一段時間內記錄的。
例如,在時間 1,水的值為 4。水的標准 RGB 顏色是藍色 (0,0,255)。 水有 5 個可能的值。 在藍色的情況下,255 / 5 = 51。要在藍色調色板上獲得 4 值的效果,請乘以 51 x 4 = 204。由於我們希望更高的值更暗,我們減去 255(白色)- 205 得到51. 紅色和綠色分量最終為 0。因此在時間 N 讀取的值是加權 R、G 和 B 值的乘積。 我們反轉要從 255 中減去的 0 值,使它們顯示為白色。 更強的值更暗。
因此,為了計算時間 1 的 R'G' 和 B',我使用了:
answer = data[:,1:4] - (data[:,1:4] / data[:,[0]] * data[:,[4]])
我可以從中提取 [R, G, B] 並回答並放入某個 x,y 的圖像中。 效果很好。 但我不知道如何使用 Range、R、G 和 B 並計算所有時間 1、2、... N 的新 R'、G'、B'。如果可能,嘗試擴展 numpy 方法。 我用標准循環做到了:
for row in range(rows):
for col in range(cols):
r = int(data[row,1] - (data[row,1] / data[row,0] * data[row,col_offset+col] ))
g = int(data[row,2] - (data[row,2] / data[row,0] * data[row,col_offset+col] ))
b = int(data[row,3] - (data[row,3] / data[row,0] * data[row,col_offset+col] ))
almostImage[row,col] = [r,g,b]
我可以在 matplotlib 中顯示圖像並將其保存到.png 等。所以我認為下一步是嘗試對時間點二維數組進行列表理解,然后再參考范圍和 RGB 值。 會試一試。
嘗試這個:
A*(A / B[:,[0]] + B[:,1:].sum(1, keepdims=True))
Output:
array([[ 0. , 3. , 8. , 15. ],
[24. , 32.5 , 42. , 52.5 ],
[ 6.33333333, 6.33333333, 6.33333333, 6.33333333]])
解釋:
A/B[:,[0]]
利用numpy 廣播。B[:,1:].sum(1, keepdims=True)
就是B[:,1] + B[:,2]
,而keepdims=True
允許維度保持不變。 打印它以查看詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.