How to replicate array to specific length array

Question:

I want replicate a small array to specific length array

Example:

var = [22,33,44,55] # ==> len(var) = 4
n = 13

The new array that I want would be:

var_new = [22,33,44,55,22,33,44,55,22,33,44,55,22]

This is my code:

import numpy as np
var = [22,33,44,55]
di = np.arange(13)
var_new = np.empty(13)
var_new[di] = var

I get error message:

DeprecationWarning: assignment will raise an error in the future, most likely because your index result shape does not match the value array shape. You can use arr.flat[index] = values to keep the old behaviour.

But I get my corresponding variable:

var_new
array([ 22.,  33.,  44.,  55.,  22.,  33.,  44.,  55.,  22.,  33.,  44.,
    55.,  22.])

So, how to solve the error? Is there an alternative?


See also Repeat list to max number of elements for general methods not specific to Numpy.

See also Circular list iterator in Python for lazy iteration over such data.

Asked By: delta27

||

Answers:

First of all, you don’t get an error, but a warning, that var_new[di] = var is deprecated if var_new[di] has dimensions that do not match var.

Second, the error message tells what to do: use

var_new[di].flat = var

and you do not get a warning any more and it is guaranteed to work.


Another, easy way to do this if numpy is not needed is to just use itertools:

>>> import itertools as it
>>> var = [22, 33, 44, 55]
>>> list(it.islice(it.cycle(var), 13))
[22, 33, 44, 55, 22, 33, 44, 55, 22, 33, 44, 55, 22]

There are better ways to replicate the array, for example you could simply use np.resize:

Return a new array with the specified shape.

If the new array is larger than the original array, then the new array is filled with repeated copies of a. […]

>>> import numpy as np
>>> var = [22,33,44,55]
>>> n = 13
>>> np.resize(var, n)
array([22, 33, 44, 55, 22, 33, 44, 55, 22, 33, 44, 55, 22])
Answered By: MSeifert

Copy the array (called lists in python) with [:] because they are mutable. The python short cut is then just to multiply the copy and add one more
element.

>>> var = [22, 33, 44, 55]
>>> n = 3
>>> newlist = var[:]*n + var[:1]

gives the 13 elements you want.

Answered By: Hillsie
var = [22,33,44,55]
n = 13

Repeating a list (or any other iterable) can be done without numpy, using itertools‘s cycle() and islice() functions

from itertools import cycle, islice
var_new = list(islice(cycle(var),0,n)
Answered By: Uri Goren