使用索引位置填充2-D numpy数组

时间:2017-09-28 01:42:38

标签: python numpy

我一直试图找出一种干净,pythonic的方法,用该元素的索引值填充空的numpy数组的每个元素,而不使用for循环。对于1-D而言,它很简单,您只需使用np.arange或基本range之类的内容即可。但是在2D和更高的维度上,我很难理解如何轻松地做到这一点。

(编辑:或者只是建立一个这样的常规列表,然后np.array(lst)它。我想我刚刚回答了我的问题 - 使用列表理解?)

示例:

rows = 4
cols = 4
arr = np.empty((rows, cols, 2))  # 4x4 matrix with [x,y] location

for y in range(rows):
    for x in range(cols):
        arr[y, x] = [y, x]

'''
Expected output:
[[[0,0], [0,1], [0,2], [0,3]],
 [[1,0], [1,1], [1,2], [1,3]],
 [[2,0], [2,1], [2,2], [2,3]],
 [[3,0], [3,1], [3,2], [3,3]]]
'''

5 个答案:

答案 0 :(得分:3)

您展示的是4X4矩阵的meshgrid;您可以使用np.mgrid,然后转置结果:

np.moveaxis(np.mgrid[:rows,:cols], 0, -1)
#array([[[0, 0],
#        [0, 1],
#        [0, 2],
#        [0, 3]],

#       [[1, 0],
#        [1, 1],
#        [1, 2],
#        [1, 3]],

#       [[2, 0],
#        [2, 1],
#        [2, 2],
#        [2, 3]],

#       [[3, 0],
#        [3, 1],
#        [3, 2],
#        [3, 3]]])

或将np.meshgrid矩阵索引 ij一起使用:

np.dstack(np.meshgrid(np.arange(rows), np.arange(cols), indexing='ij'))
#array([[[0, 0],
#        [0, 1],
#        [0, 2],
#        [0, 3]],

#       [[1, 0],
#        [1, 1],
#        [1, 2],
#        [1, 3]],

#       [[2, 0],
#        [2, 1],
#        [2, 2],
#        [2, 3]],

#       [[3, 0],
#        [3, 1],
#        [3, 2],
#        [3, 3]]])

答案 1 :(得分:3)

使用np.indicesconcatenate

的另一种方式
 np.concatenate([x.reshape(4,4,1) for x in np.indices((4,4))],2)

np.dstack

np.dstack(np.indices((4,4)))

因为你有很多可能性,所以有一些基准标记

def Psidom_mrgid(rows,cols):
    np.mgrid[:rows, :cols].transpose((1, 2, 0))

def Psidom_mesh(rows,cols):
    np.dstack(np.meshgrid(np.arange(rows), np.arange(cols), indexing='ij'))

def Mad_tile(rows,cols):
    r = np.tile(np.arange(rows).reshape(rows, 1), (1, cols))
    c = np.tile(np.arange(cols), (rows, 1))
    result = np.stack((r, c), axis=-1)

def bora_comp(rows,cols):
    x = [[[i, j] for j in range(rows)] for i in range(cols)]

def djk_ind(rows,cols):
    np.concatenate([x.reshape(rows, cols, 1) for x in np.indices((rows, cols))], 2)

def devdev_mgrid(rows,cols):
    index_tuple = np.mgrid[0:rows, 0:cols]
    np.dstack(index_tuple).reshape((rows, cols, 2)


In[8]: %timeit Psidom_mrgid(1000,1000)
100 loops, best of 3: 15 ms per loop

In[9]: %timeit Psidom_mesh(1000,1000)
100 loops, best of 3: 9.98 ms per loop

In[10]: %timeit Mad_tile(1000,1000)
100 loops, best of 3: 15.3 ms per loop

In[11]: %timeit bora_comp(1000,1000)
1 loop, best of 3: 221 ms per loop

In[12]: %timeit djk_ind(1000,1000)
100 loops, best of 3: 9.72 ms per loop

In[13]: %timeit devdev_mgrid(1000,1000)
10 loops, best of 3: 20.6 ms per loop

答案 2 :(得分:1)

我猜这是非常pythonic:

[[[i,j] for j in range(5)] for i in range(5)]

输出:

  

[[[0,0,[0,1],[0,2],[0,3],[0,4]],

     

[[1,0],[1,1],[1,2],[1,3],[1,4]],

     

[[2,0],[2,1],[2,2],[2,3],[2,4]],

     

[[3,0],[3,1],[3,2],[3,3],[3,4]],

     

[[4,0],[4,1],[4,2],[4,3],[4,4]]]

答案 3 :(得分:1)

有几种方法可以实现这一点。

一种方法是使用herenp.tile

r = np.tile(np.arange(rows).reshape(rows, 1), (1, cols))
c = np.tile(np.arange(cols), (rows, 1))
result = np.stack((r, c), axis=-1)

获取坐标的更好方法可能是np.stack

rc = np.meshgrid(np.arange(rows), np.arange(cols), indexing='ij')
result = np.stack(rc, axis=-1)

答案 4 :(得分:1)

查看numpy.mgrid,它将返回带有i和j索引的两个数组。要组合它们,您可以堆叠数组并重新整形。像这样:

import numpy as np

def index_pair_array(rows, cols):
    index_tuple = np.mgrid[0:rows, 0:cols]
    return np.dstack(index_tuple).reshape((rows, cols, 2))