Aaron Conway
Aaron Conway

Reputation: 127

making an array of n columns where each successive row increases by one

In numpy, I would like to be able to input n for rows and m for columns and end with the array that looks like:

[(0,0,0,0),
 (1,1,1,1),
 (2,2,2,2)]

So that would be a 3x4. Each column is just a copy of the previous one and the row increases by one each time. As an example: input would be 4, then 6 and the output would be and 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)]

4 rows and 6 columns where the row increases by one each time. Thanks for your time.

Upvotes: 1

Views: 1204

Answers (9)

hpaulj
hpaulj

Reputation: 231530

Several other possibilities using a (n,1) array

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

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

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

If used with a (m,) array, just leave it (n,1), and let broadcasting expand it for you.

Upvotes: 0

IanH
IanH

Reputation: 10700

As has been mentioned, there are many ways to do this. Here's what I'd do:

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

Here's an amusing alternative that will work if you aren't going to be changing the contents of the array. It should save some memory. Be careful though because this doesn't allocate a full array, it will have multiple entries pointing to the same memory address.

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

In either case, as I have written them, a 3x4 array can be created by makearray(3, 4)

Upvotes: 1

kiriloff
kiriloff

Reputation: 26333

you can simply

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

Upvotes: 0

Greg Whittier
Greg Whittier

Reputation: 3185

On more for fun

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

Upvotes: 1

Warren Weckesser
Warren Weckesser

Reputation: 114911

So many possibilities...

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

Here's one more. The neat trick here is that the values are not duplicated--only memory for the single sequence [0, 1, 2, ..., n-1] is allocated.

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

Be careful with the as_strided function. If you don't get the arguments right, you can crash Python.

To see that seq has not been copied, change seq in place, and then check 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]])

Upvotes: 5

kyle k
kyle k

Reputation: 5522

You can easily do this using built in python functions. The program counts to 3 converting each number to a string and repeats the string 6 times.

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

Here is the output.

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

Upvotes: 1

Ofir Israel
Ofir Israel

Reputation: 3913

Using count from the built-in module 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]]

Upvotes: 0

Veedrac
Veedrac

Reputation: 60167

Natively (no 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]])

Upvotes: 1

prgao
prgao

Reputation: 1787

import numpy as np

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

Upvotes: 1

Related Questions