在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列。谢谢你的时间。
答案 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),然后让广播为您展开。