1

在 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 列,每行加一。谢谢你的时间。

4

9 回答 9

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]])
于 2013-09-26T00:06:31.773 回答
1

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

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

这是输出。

ks-MacBook-Pro:~ kyle$ pbpaste | python
['000000', '111111', '222222', '333333']
于 2013-09-25T23:46:52.850 回答
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)

于 2013-09-26T00:57:25.800 回答
1
import numpy as np

def foo(n, m):
    return np.array([np.arange(n)] * m).T
于 2013-09-25T23:24:18.430 回答
1

本机(没有 Python lists):

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]])
于 2013-09-25T23:26:00.260 回答
1

更多乐趣

np.zeros((n, m), dtype=np.int) + np.arange(n, dtype=np.int)[:,None]
于 2013-09-26T00:31:42.690 回答
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]]
于 2013-09-25T23:30:30.577 回答
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]]
于 2013-09-26T01:01:44.720 回答
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),然后让广播为您扩展它。

于 2013-09-26T02:26:00.863 回答