参见英文答案 > Iterate over numpy with index (numpy equivalent of python enumerate) 3个
对于python dict,我可以使用iteritems()同时循环键和值.但我找不到NumPy阵列的这种功能.我必须像这样手动跟踪idx:
idx = 0
for j in theta:
some_function(idx,j,theta)
idx += 1
有一个更好的方法吗?
解决方法:
还有一些选择.以下假设您正在迭代1d NumPy数组.
用range
迭代
for j in range(theta.shape[0]): # or range(len(theta))
some_function(j, theta[j], theta)
请注意,这是与numba
一起使用的3个解决方案中的the only.这是值得注意的,因为显式地迭代NumPy数组通常仅在与numba或其他预编译方式结合时才有效.
用enumerate
迭代
for idx, j in enumerate(theta):
some_function(idx, j, theta)
1d阵列的3种解决方案中效率最高的.请参阅下面的基准测试
for idx, j in np.ndenumerate(theta):
some_function(idx[0], j, theta)
注意idx [0]中的附加索引步骤.这是必要的,因为1d NumPy数组的索引(如形状)是作为单个元组给出的.对于1d数组,np.ndenumerate是低效的;它的好处只适用于多维数组.
绩效基准
# Python 3.7, NumPy 1.14.3
np.random.seed(0)
arr = np.random.random(10**6)
def enumerater(arr):
for index, value in enumerate(arr):
index, value
pass
def ranger(arr):
for index in range(len(arr)):
index, arr[index]
pass
def ndenumerater(arr):
for index, value in np.ndenumerate(arr):
index[0], value
pass
%timeit enumerater(arr) # 131 ms
%timeit ranger(arr) # 171 ms
%timeit ndenumerater(arr) # 579 ms