2017-08-25 105 views
0

我有一個大小爲8x8的numpy數組。 這裏是numpy的數組:迭代一個numpy數組並對每個元素進行操作

QuantTable = np.array([[16, 11 ,10, 16, 24, 40, 51, 61], 
        [12, 12, 14, 19, 26, 58, 60, 55], 
        [14, 13, 16, 24, 40, 57, 69, 56], 
        [14, 17, 22, 29, 51, 87, 80, 62], 
        [18, 22, 37, 29, 51, 87, 80, 62], 
        [24, 35, 55, 64, 81, 109, 103, 77], 
        [49, 64, 78, 87, 103, 121, 120, 101], 
        [72, 92, 95, 98, 112, 100, 103, 99]]) 

我想在陣列中的元素執行的操作。 我已經創建了一個接受縮放因子值和Numpy數組的函數。 這就是:

def quantizationTable(Qval, QuantTable): 
    if Qval < 50: 
     scalingFactor = 5000/Qval 
     for x in range(QuantTable): 
      for y in range(QuantTable): 
       QuantTable[x][y] = ((scalingFactor * QuantTable[x][y] + 50/100) 
       if QuantTable[x][y] == 0: 
        QuantTable[x][y] = 1 
    return QuantTable 
    else: 
     scalingFactor = 200 - 2(Qval) 
     for x in range(QuantTable): 
      for y in range(QuantTable): 
       QuantTable[x][y] = ((scalingFactor * QuantTable[x][y] + 50/100) 
       if QuantTable[x][y] == 0: 
        QuantTable[x][y] = 1 

return QuantTable 
我無法遍歷數組numpy的過去,我的執行操作

。我試圖將公式 ((比例因子值* numpy數組的元素+ 50)/ 100)應用到numpy數組的每個元素並返回修改後的數組。 有人可以幫忙嗎?

+0

'我無法遍歷numpy數組並執行我的操作.' - 詳細說明? – Divakar

+2

爲什麼是循環? 'return scalingFactor * QuantTable + 50/100' – Feodoran

+0

因爲我需要對每個元素執行操作。如果我的邏輯錯誤,請糾正我。謝謝。 – TheTank

回答

3

只需刪除循環和索引。 Numpy會自動廣播這些操作。此外,您的很多代碼都可以從if...else聲明中刪除。

def quantizationTable(Qval, QuantTable): 
    QuantTable = np.asarray(QuantTable, dtype=np.float32) 
    if int(Qval) < 50: 
     scalingFactor = 5000/Qval 
    else: 
     scalingFactor = 200 - 2 * Qval # confirm that this is what you want? 

    QuantTable *= scalingFactor + 0.5 
    QuantTable[QuantTable == 0] = 1 

    return QuantTable 
+2

你需要小心就地操作。如果'QuantTable'是一個會導致截斷的整數數組(因爲縮放是一個浮點數)。 – MSeifert

+0

@ MSeifert哦,好點。我應該添加'np.asarray(...,dtype)'cast。 –

+0

scalingFactor = 200 - 2 * Qval - >這就是我想要的。 – TheTank

相關問題