簡體   English   中英

將兩個 numpy arrays 與基於兩個 arrays 的方程組合

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

解釋:

  1. 第一個操作A/B[:,[0]]利用numpy 廣播
  2. 那么B[:,1:].sum(1, keepdims=True)就是B[:,1] + B[:,2] ,而keepdims=True允許維度保持不變。 打印它以查看詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM