创建具有一系列整数的置换2D数组的有效方法

时间:2016-02-02 21:42:46

标签: python arrays numpy permutation

我正在尝试找到一种有效的方法来生成一组x-y坐标,以识别正方形点阵中的每个位置,这样,如果格子由NxN网格组成,那么<​​/ p>

N = 100; x = range(N)

我想计算一组数组,例如array([[0,0], [0,1], [0,2] ..[0,100], [1,0], [1,1], [1,2], ..[1,100], ...[100,0], [100,1], [100,2], ..[100,100]])。排序无关紧要。到目前为止,我已经尝试使用itertools.product(x, repeat=2),但输出itertools对象不容易转换为上面的2D数组。任何建议都会有所帮助。

5 个答案:

答案 0 :(得分:3)

尝试N = 100; result = [[x, y] for x in range(N) for y in range(N)]

答案 1 :(得分:2)

实际上,我认为你已经钉了它,所有你需要做的就是将迭代器转换为一个列表,这是微不足道的:

y = list(itertools.product(x,repeat=2))

答案 2 :(得分:2)

一个numpy解决方案可能是:

$scope.img[nextId] = "img/cloud"+nextId; //change initial img

$timeout( function(){ $scope.img[nextId] = "img/pic"+nextId; }, 1000)`; //change back

这似乎比python方式快得多:

X,Y = np.meshgrid(np.arange(0,100), np.arange(0,100))
result = np.vstack((Y.ravel(), X.ravel())).T
result
# array([[ 0,  0],
#        [ 0,  1],
#        [ 0,  2],
#           ..., 

答案 3 :(得分:1)

最小化副本时速度更快:

trader

试验:

def matnp(n):    
    a=np.arange(n)
    b=np.empty((2*n,n),a.dtype)
    b[:n]=np.tile(a,n).reshape(n,n)
    b[n:]=b[:n].T    
    return b.reshape(2,n*n).T

和Numba:

In [11]: %timeit matnp(101)
10000 loops, best of 3: 54 µs per loop

测试:

from numba import jit
@jit
def matnb(n):
    a=np.empty((n*n,2),np.int)
    k=0
    for i in range(n):
        for j in range(n):
            a[k]=i,j
            k=k+1
    return a  

答案 4 :(得分:0)

arr = np.arange(101)
coords = np.transpose([np.repeat(arr, arr.size),np.tile(arr, arr.size)])

print(coords)