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做到这一点的最快方法了?
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
在适当的位置进行更新.
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)