Skip to main content
 首页 » 编程设计

python之制作一个 n 列的数组,其中每个连续的行增加一个

2025年05月04日9freeliver54

在 numpy 中,我希望能够为行输入 n,为列输入 m,并以如下所示的数组结尾:

[(0,0,0,0), 
 (1,1,1,1), 
 (2,2,2,2)] 

所以这将是 3x4。每列只是前一列的副本,并且该行每次增加一。举个例子: 输入将是 4,然后是 6,输出将是数组

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

4 行 6 列,每行增加 1。谢谢你的时间。

请您参考如下方法:

这么多的可能性......

In [51]: n = 4 
 
In [52]: m = 6 
 
In [53]: np.tile(np.arange(n), (m, 1)).T 
Out[53]:  
array([[0, 0, 0, 0, 0, 0], 
       [1, 1, 1, 1, 1, 1], 
       [2, 2, 2, 2, 2, 2], 
       [3, 3, 3, 3, 3, 3]]) 
 
In [54]: np.repeat(np.arange(n).reshape(-1,1), m, axis=1) 
Out[54]:  
array([[0, 0, 0, 0, 0, 0], 
       [1, 1, 1, 1, 1, 1], 
       [2, 2, 2, 2, 2, 2], 
       [3, 3, 3, 3, 3, 3]]) 
 
In [55]: np.outer(np.arange(n), np.ones(m, dtype=int)) 
Out[55]:  
array([[0, 0, 0, 0, 0, 0], 
       [1, 1, 1, 1, 1, 1], 
       [2, 2, 2, 2, 2, 2], 
       [3, 3, 3, 3, 3, 3]]) 

还有一个。这里巧妙的技巧是值不重复——只为单个序列 [0, 1, 2, ..., n-1] 分配内存。

In [67]: from numpy.lib.stride_tricks import as_strided 
 
In [68]: seq = np.arange(n) 
 
In [69]: rep = as_strided(seq, shape=(n,m), strides=(seq.strides[0],0)) 
 
In [70]: rep 
Out[70]:  
array([[0, 0, 0, 0, 0, 0], 
       [1, 1, 1, 1, 1, 1], 
       [2, 2, 2, 2, 2, 2], 
       [3, 3, 3, 3, 3, 3]]) 

小心 as_strided 函数。如果参数不正确,可能会使 Python 崩溃。

查看seq没有被复制,改变seq,然后检查rep:

In [71]: seq[1] = 99 
 
In [72]: rep 
Out[72]:  
array([[ 0,  0,  0,  0,  0,  0], 
       [99, 99, 99, 99, 99, 99], 
       [ 2,  2,  2,  2,  2,  2], 
       [ 3,  3,  3,  3,  3,  3]])