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