как скопировать массив numpy в целом - PullRequest
1 голос
/ 29 января 2020

Как мне скопировать массив numpy, чтобы он повторялся (как целый массив) n раз?

Итак, с примером массива:

import numpy as np
x = np.arange(0, 5)

Я хочу чтобы создать массив, как показано ниже, без необходимости вручную вводить np.arange(0, 5) n раз:

x_3times = np.concatenate([np.arange(0, 5), np.arange(0, 5), np.arange(0, 5)])     

или с заданной длиной вывода (например, 12)?

x_12 = np.concatenate([np.arange(0, 5), np.arange(0, 5), np.arange(0, 5)])[0:12]  

Ответы [ 2 ]

3 голосов
/ 29 января 2020

Вы можете использовать np.tile .

>> x_3times = np.tile(x, 3)
>> x_3times

array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4])

Для повторения до определенного предела используйте np.resize

>> x_12 = np.resize(x, 12)
>> x_12

array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1])
2 голосов
/ 29 января 2020

Просто попробуйте понимание списка:

x_3times = np.concatenate([np.arange(0, 5) for x in range(3)])

, где число 3 может быть заменено на любое число n.

edit

если вы хотите ограничить длину любым числом, вы можете просто сделать:

cutoff = 12
x_3times = np.concatenate([np.arange(0, 5) for x in range(3)])[:cutoff]

, что приведет к:

array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1])

Однако это не очень эффективно строка кода, особенно при работе с большими числами. Другой ответ, вероятно, будет сделать генератор:

def generator(arr, n, cutoff=None):
    length = len(arr)
    if cutoff:
        for i in range(cutoff):
            yield arr[i%length]
    else:
        for _ in range(n):
            for i in arr:
                yield i

array = np.array([x for x in generator(np.arange(0, 5), 3, 12)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...