在 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]])
关于python - 制作一个 n 列的数组,其中每个连续的行增加一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19016817/