在Python 3中将查找表应用于NUMPY数组的最有效方法

时间:2017-08-26 02:24:31

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

我正在尝试尽可能多地使用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做到这一点的最快方法了?

2 个答案:

答案 0 :(得分:5)

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]的作用相同。另请注意,您应该注意您的dtypes - 在您的示例数据中,您在LUT中有-1,但您说您的数据是未签名的。

如果您想提高效率,可以使用out的{​​{1}}参数:

take()

这样可以避免创建新数组,并且与更新lut.take(arr, out=arr) 的原始代码更相似。

答案 1 :(得分:3)

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