【问题标题】:Most efficient way to apply Look Up Tables to NUMPY array in Python 3在 Python 3 中将查找表应用于 NUMPY 数组的最有效方法
【发布时间】:2018-02-04 02:13:25
【问题描述】:

我正在尝试使用 numpy 数组尽可能提高性能。

我有一个查找表,例如MYLUT = [0,2,5,7,8,12,-1,...,229]

我有一个 numpy 数组 MYARRAY,形状为 uint8 值 (300,200000)

将查找表应用于 MYARRAY 中的所有元素的最快方法是什么?

目前我只是在使用 for 循环:

for i in range(300) :
    for j in range(200000) :
        MYARRAY[i][j] = MYLUT[MYARRAY[i][j]]

我可以做得更好吗?或者这已经是 Python 中最快的方法了?

【问题讨论】:

    标签: arrays python-3.x numpy multidimensional-array


    【解决方案1】:

    MYLUT[MYARRAY] 应该可以工作:


    MYLUT = np.array([0,2,5,7,8,12,-1,229])
    MYARRAY = np.random.randint(0,8,8).reshape(4,2)
    
    MYARRAY
    #array([[5, 4],
    #       [7, 5],
    #       [4, 3],
    #       [1, 5]])
    
    new_array = np.empty_like(MYARRAY)
    for i in range(4) :
        for j in range(2) :
            new_array[i,j] = MYLUT[MYARRAY[i,j]]
    
    new_array
    #array([[ 12,   8],
    #       [229,  12],
    #       [  8,   7],
    #       [  2,  12]])
    
    MYLUT[MYARRAY]
    #array([[ 12,   8],
    #       [229,  12],
    #       [  8,   7],
    #       [  2,  12]])
    

    【讨论】:

    • 这似乎比使用 numpy.take 快一点。哦,嘿,既然我在这里,我如何创建一个形状为 (100,1000) 的 numpy 数组,并且该行的每个元素都保存该行的索引值,因此对于第 0 行,数组元素将是 [0,0 ,...0] ( 进行转换
    • 您可以使用np.repeat(np.arange(100), 1000).reshape(100, 1000)np.broadcast_to(np.arange(100)[:,None], (100, 1000))。我假设你的意思是 99 当你说 999 因为总共有 100 行?
    • 不错!谢啦!哦,是的,你是对的.. 它应该是 [99,99,...99]。
    【解决方案2】:

    NumPy 可以非常有效地做到这一点:

    arr = np.array([[1,2,3],[0,0,1]])
    lut = np.array([0,2,5,7,8,12])
    print(lut.take(arr))
    

    它给出:

    array([[2, 5, 7],
           [0, 0, 2]])
    

    请注意,这与lut[arr] 的作用相同。另请注意,您应该注意您的数据类型——在您的示例数据中,您在 LUT 中有 -1,但您说您的数据是无符号的。

    如果你想更加高效,可以使用take()out参数:

    lut.take(arr, out=arr)
    

    这避免了创建新数组,并且更类似于您在适当位置更新arr 的原始代码。

    【讨论】:

    • lut.take( arr, mode="clip" ) 很有用;默认为mode="raise"
    猜你喜欢
    • 2013-12-05
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 2011-10-08
    • 2018-07-11
    • 2018-08-12
    • 1970-01-01
    • 2016-12-09
    相关资源
    最近更新 更多