Creating numpy array with a specific pattern

Question:

I’m trying to create a numpy array of intergers ascending intergers (1,2,3,…), such that the n is repeated n times. For example for maximum number 4 I would like

my_arr = [1,2,2,3,3,3,4,4,4,4]

Now this is easy using a for loop

my_arr = numpy.array([])
max = 4
for i in range(1,max + 1):
    my_arr = numpy.append(my_arr,np.ones(i)*i)

but this gets horribly slow for large numbers max.
Any suggestions?

Asked By: Nitaa a

||

Answers:

Use np.repeat:

import numpy as np

def pattern(n):
    x = np.arange(1, n + 1)
    return np.repeat(x, x)

# >>> pattern(4)
# array([1, 2, 2, 3, 3, 3, 4, 4, 4, 4])
Answered By: Chrysophylaxs

There is a builtin way to do this.

import numpy as np


def builtinway(maxval=10):
    arr = list(range(1, maxval+1))
    return np.repeat(arr, arr)

One way to do this pretty quickly and directly would be as follows. In practice, space would become a problem before the number of operations grows too quickly. (Though in practice, you probably wouldn’t do this).

def make_arr(maxval=10):
    arrlen = maxval * (maxval + 1) // 2
    arr = np.ones(arrlen)
    for i in range(2, maxval+1):
        addend = np.ones(arrlen)
        addend[:i*(i-1) // 2] = 0
        arr += addend
    return arr
Answered By: davidlowryduda
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.