在 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 列,每行加一。谢谢你的时间。
这么多可能...
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 函数轻松完成此操作。该程序计数为 3,将每个数字转换为一个字符串并重复该字符串 6 次。
print [6*str(n) for n in range(0,4)]
这是输出。
ks-MacBook-Pro:~ kyle$ pbpaste | python
['000000', '111111', '222222', '333333']
如前所述,有很多方法可以做到这一点。这是我要做的:
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)
import numpy as np
def foo(n, m):
return np.array([np.arange(n)] * m).T
本机(没有 Python list
s):
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]])
更多乐趣
np.zeros((n, m), dtype=np.int) + np.arange(n, dtype=np.int)[:,None]
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]]
你可以简单地
>>> 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]]
使用 (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),然后让广播为您扩展它。