2017-08-25 2 views
0

J'ai un tableau numérique de taille 8x8. Voici le tableau numpy:Itération sur un tableau numérique et fonctionnement sur chaque élément

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

Je voudrais effectuer les opérations sur les éléments du tableau. J'ai créé une fonction qui accepte une valeur de facteur d'échelle et un tableau Numpy. Ici, il est:

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 

Je ne parviens pas à itérer sur le tableau numpy et effectuer mes opérations. J'essaye d'appliquer la formule ((facteur de mise à l'échelle valeur * élément de tableau numpy + 50)/100) à chaque élément du tableau numpy et retourne le tableau modifié. Quelqu'un peut-il aider s'il vous plaît?

+0

'J'ai des problèmes pour parcourir le tableau numérique et effectuer mes opérations.» - Élaborer? – Divakar

+2

Pourquoi les boucles? 'return scalingFactor * QuantTable + 50/100' – Feodoran

+0

Parce que j'ai besoin d'effectuer l'opération sur chaque élément. Corrigez-moi si je me trompe dans ma logique même. Merci. – TheTank

Répondre

3

Supprimez simplement les boucles et l'indexation. Numpy diffuse automatiquement ces opérations. En outre, une grande partie de votre code peut être retirée des instructions 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

Vous devez faire attention aux opérations sur place. Si 'QuantTable' est un tableau d'entiers qui conduirait à la troncature (parce que la mise à l'échelle est un flottant). – MSeifert

+0

@MSeifert Oh, bon point. Je devrais probablement ajouter un cast 'np.asarray (..., dtype)'. –

+0

scalingFactor = 200 - 2 * Qval -> C'est ce que je veux. – TheTank