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

bFi*_*ig8 3 arrays numpy multidimensional-array python-3.x

我试图尽可能多地使用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]]
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*nck 7

NumPy可以非常有效地完成这项工作:

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

它给:

array([[2, 5, 7],
       [0, 0, 2]])
Run Code Online (Sandbox Code Playgroud)

请注意,这与做同样的事情lut[arr].另请注意,您应该注意您的dtypes - 在您的示例数据中,您在LUT中有-1,但您说您的数据是未签名的.

如果您想要提高效率,可以使用以下out参数take():

lut.take(arr, out=arr)
Run Code Online (Sandbox Code Playgroud)

这样可以避免创建新数组,并且更类似于原始代码,这些代码会arr在适当的位置进行更新.


Psi*_*dom 5

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]])
Run Code Online (Sandbox Code Playgroud)