如何使用索引和值迭代 1d NumPy 数组 [重复]

Posted

技术标签:

【中文标题】如何使用索引和值迭代 1d NumPy 数组 [重复]【英文标题】:How to iterate 1d NumPy array with index and value [duplicate] 【发布时间】:2018-08-29 07:04:46 【问题描述】:

对于 python dict,我可以使用 iteritems() 同时循环键和值。但我找不到 NumPy 数组的这种功能。我必须像这样手动跟踪idx

idx = 0 
for j in theta:
   some_function(idx,j,theta)
   idx += 1

有没有更好的方法来做到这一点?

【问题讨论】:

您可以为此使用enumerate..***.com/questions/22171558/what-does-enumerate-mean。或者迭代range(len(theta)) 或者更好,ndenumerate 如果你正在处理 NDarrays。 【参考方案1】:

例如,您可以使用numpy.ndenumerate

import numpy as np
test_array = np.arange(2, 3, 0.1)
for index, value in np.ndenumerate(test_array):
    print(index[0], value)

更多信息请参考https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndenumerate.html

【讨论】:

还请记住,这可以扩展到多个维度。 index 是一个元组,包含数组每个维度的索引。很有用!【参考方案2】:

有几种选择。下面假设您正在迭代一维 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)

一维数组的 3 种解决方案中最有效的一种。请参阅下面的基准测试。

使用np.ndenumerate 进行迭代

for idx, j in np.ndenumerate(theta):
   some_function(idx[0], j, theta)

注意idx[0] 中的附加索引步骤。这是必要的,因为一维 NumPy 数组的索引(如 shape)是作为单例元组给出的。对于一维数组,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

【讨论】:

以上是关于如何使用索引和值迭代 1d NumPy 数组 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Numpy学习二:数组的索引与切片

将 2D numpy 数组重塑为 3 个具有 x,y 索引的 1D 数组

在 1D NumPy 数组中查找值的索引/位置(具有相同的值)[重复]

Numpy数组对象的操作-索引机制切片和迭代方法

pandas库Series的函数介绍

如何在 NumPy 中将 HDF5 2D 数组转换为 1D?