假设我有一个形状(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]]
答案 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])))