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

标签 python arrays numpy

在 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/

相关文章:

python - 如何让 Python 智能地将动态输入转换为固定宽度输出?

python - 如何从 Python 3 中的字符串列表中获取时间戳和用户 ID?

arrays - 结构内部的 Swift 数组仅追加一次,如何单独再次追加?

php - 将数组放入 session symfony2

arrays - 解码具有嵌套异构子对象的对象数组

python - 如何使用 OpenCV 在 Python 中将单个 BGR 数组转换为 HSV 数组?

python - numpy.genfromtxt 与 datetime.strptime 转换器

python - 来自 sys.platform 的可能值?

python - 用 Pandas 合并两个数字

python - numpy 分块矩阵如何工作?