无需迭代Python

时间:2015-05-19 09:13:56

标签: python arrays numpy

假设我有一个形状(2,3)充满花车的numpy数组。

我还需要一个X和Y值的所有可能组合的数组(它们在数组中的相应位置)。是否有类似simpe函数的东西将索引作为一个元组从一个numpy数组中获取,我不需要让for循环遍历数组?

示例代码:

arr=np.array([np.array([1.0,1.1,1.2]),
              np.array([1.0,1.1,1.2])])
indices=np.zeros([arr.shape[0]*arr.shape[1]])

#I want an array of length 6 like np.array([[0,0],[0,1],[0,2],[1,0],[1,1], [1,2]])
#Code so far, iterates though :(
ik=0
for i in np.arange(array.shape[0]):
    for k in np.arange(array.shape[1]):
        indices[ik]=np.array([i,k])
        ik+=1

现在,在此之后,我还想制作一个数组,其长度为'指数'包含" XYZ坐标的数组"如在每个包含XY'指数'来自' ar的“Z值”。有没有比这更简单的方法(如果可能的话,没有再次遍历数组):

xyz=np.zeros(indices.shape[0])
for i in range(indices.shape[0]):
    xyz=np.array([indices[i,0],indices[i,1],arr[indices[i,0],indices[i,1]]

3 个答案:

答案 0 :(得分:2)

您可以使用np.ndindex

indices = np.ndindex(arr.shape)

这将提供迭代器而不是数组,但您可以轻松地将其转换为列表:

>>> list(indices)
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]

然后,您可以沿第二维堆叠索引与原始数组:

np.hstack((list(indices), arr.reshape((arr.size, 1))))

答案 1 :(得分:0)

可能有很多方法可以实现这一目标......可能的解决方案如下:

使用np.unravel_index

可以解决第一个问题
max_it = arr.shape[0]*arr.shape[1]
indices = np.vstack(np.unravel_index(np.arange(max_it),arr.shape)).T

然后可以用

构造第二个数组
xyz = np.column_stack((indices,arr[indices[:,0],indices[:,1]]))

<强>计时

在您的阵列timeit上提供我的代码10000 loops, best of 3: 27.7 µs per loop(grc的解决方案需要10000 loops, best of 3: 39.6 µs per loop

shape=(50,60)的较大数组上,我有1000 loops, best of 3: 247 µs per loop(grc的解决方案需要100 loops, best of 3: 2.17 ms per loop

答案 2 :(得分:0)

对于您的指数:

indices = np.concatenate((np.meshgrid(range(arr.shape[0]), range(arr.shape[1])))