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

Python 制作一个n列数组,其中每个连续行增加1,python,arrays,numpy,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列,其中行每增加一次。谢谢你抽出时间 本地(无Pythonlists): import numpy as n

在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列,其中行每增加一次。谢谢你抽出时间

本地(无Python
list
s):

import numpy as np

def foo(n, m):
    return np.array([np.arange(n)] * m).T
本机(无Python
list
s):


使用内置模块
itertools
中的
count

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

使用内置模块
itertools
中的
count

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

您可以使用内置的python函数轻松地实现这一点。程序计数为3,将每个数字转换为字符串,并将字符串重复6次

print [6*str(n) for n in range(0,4)]
这是输出

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

您可以使用内置的python函数轻松地实现这一点。程序计数为3,将每个数字转换为字符串,并将字符串重复6次

print [6*str(n) for n in range(0,4)]
这是输出

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

这么多的可能性

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__Èstripped
功能。如果参数不正确,可能会使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]])

这么多的可能性

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__Èstripped
功能。如果参数不正确,可能会使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]])
为了好玩,请多看一些

np.zeros((n, m), dtype=np.int) + np.arange(n, dtype=np.int)[:,None]
为了好玩,请多看一些

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

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

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

在这两种情况下,正如我所写的,可以通过
makearray(3,4)

创建
3x4
数组。正如前面提到的,有很多方法可以做到这一点。 下面是我要做的:

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)
创建,您可以

>>> 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]]
你可以简单地

>>> 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)数组的其他几种可能性


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

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


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

您的意思是第二个数组最后一行中的3,对吗?您将如何处理此数组?如果后续操作可以使用numpy的广播功能,您可能可以避免创建这样的阵列。您的意思是第二个阵列的最后一行中有3个,对吗?您将如何处理此阵列?如果后续操作可以使用numpy的广播功能,则可以避免创建这样的数组。user2785334要求的是数字矩阵,而不是字符矩阵。此外,user2785334希望使用Numpy数组来执行此操作。user2785334要求的是数字矩阵,而不是字符。此外,用户2785334希望使用一个Numpy数组来实现它。细微变化:
(np.zeros((m,n),dtype=int)+np.arange(n)).T
细微变化:
(np.zeros((m,n),dtype=int)+np.arange(n)).T
。我没有注意到,您已经演示了如何使用
,就像您大步向前走一样。我没有注意到您已经演示了如何使用