制作n列数组,其中每个连续行增加1

时间:2013-09-25 23:22:43

标签: 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列。谢谢你的时间。

9 个答案:

答案 0 :(得分:5)

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

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]])

答案 1 :(得分:1)

import numpy as np

def foo(n, m):
    return np.array([np.arange(n)] * m).T

答案 2 :(得分:1)

原生(没有Python list):

rows, columns = 4, 6
numpy.arange(rows).reshape(-1, 1).repeat(columns, axis=1)
#>>> 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]])

答案 3 :(得分:1)

您可以使用内置的python函数轻松完成此操作。程序计数为3将每个数字转换为字符串并重复字符串6次。

print [6*str(n) for n in range(0,4)]

这是输出。

ks-MacBook-Pro:~ kyle$ pbpaste | python
['000000', '111111', '222222', '333333']

答案 4 :(得分:1)

更多是为了好玩

np.zeros((n, m), dtype=np.int) + np.arange(n, dtype=np.int)[:,None]

答案 5 :(得分:1)

如前所述,有很多方法可以做到这一点。 这就是我要做的事情:

import numpy as np
def makearray(m, n):
    A = np.empty((m,n))
    A.T[:] = np.arange(m)
    return A

如果您不打算更改数组的内容,这是一个有趣的替代方案。 它应该节省一些内存。 但要小心,因为这不会分配一个完整的数组,它将有多个条目指向相同的内存地址。

import numpy as np
from numpy.lib.stride_tricks import as_strided
def makearray(m, n):
    A = np.arange(m)
    return as_strided(A, strides=(A.strides[0],0), shape=(m,n))

在任何一种情况下,正如我写的那样,3x4可以创建makearray(3, 4)数组

答案 6 :(得分:0)

使用内置模块count中的itertools

>>> from itertools import count
>>> rows = 4
>>> columns = 6
>>> cnt = count()
>>> [[cnt.next()]*columns for i in range(rows)]
[[0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1], [2, 2, 2, 2, 2, 2], [3, 3, 3, 3, 3, 3]]

答案 7 :(得分:0)

你可以简单地

>>> nc=5
>>> nr=4
>>> [[k]*nc for k in range(nr)]
[[0, 0, 0, 0, 0], [1, 1, 1, 1, 1], [2, 2, 2, 2, 2], [3, 3, 3, 3, 3]]

答案 8 :(得分:0)

使用(n,1)数组的其他几种可能性

a = np.arange(n)[:,None]  (or np.arange(n).reshape(-1,1))

a*np.ones((m),dtype=int)

a[:,np.zeros((m),dtype=int)]

如果与(m,)数组一起使用,只需将其保留(n,1),然后让广播为您展开。