迭代一个numpy数组并对每个元素进行操作

时间:2017-08-25 16:41:25

标签: python arrays numpy vectorization

我有一个大小为8x8的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数组的每个元素并返回修改后的数组。 有人可以帮忙吗?

1 个答案:

答案 0 :(得分: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