Как сделать эту операцию в NumPy (цепочка операции листов)? - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь сделать быструю генерацию массива numpy, возможно, без прохождения через python.

Я хочу создать массив numy 1D index, который бы воспринимал это как ввод:

[2,3] и это [2,4] и вернет это

 [0,1,0,1,0,1,2,0,1,2,0,1,2,0,1,2]

Объяснение:

Я повторяю от 0 до 2 (так [массив] 0,1) и повторяю это 2 раза:[0,1,0,1]

Затем я повторяю от 0 до 3 (массив [0,1,2]) и повторяю это 4 раза: [0,1,2,0,1,2,0,1,2,0,1,2] Затем я все сплющил.

Есть лиспособ сделать это полностью в NumPy?Сейчас я строю каждую таблицу отдельно в numpy с помощью np.tile () и сглаживаю все впоследствии, но я чувствую, что есть более эффективный способ, который будет переводить только вызовы функций C, а не python

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Вот векторизованное решение:

def cycles(spec):
    steps = np.repeat(*spec)
    ps = steps.cumsum()
    psj = np.zeros(ps[-1], int)
    psj[ps[:-1]] = steps[:-1]
    return np.arange(ps[-1]) - psj.cumsum()

Демонстрация:

>>> cycles(((2,3),(2,4)))
array([0, 1, 0, 1, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2])
0 голосов
/ 22 ноября 2018

Я не совсем уверен, что это то, что вы хотите;здесь каждый кортеж в вызове функции func () содержит сначала диапазон, а затем повтор.

import numpy


def func(tups):
    Arr = numpy.empty(numpy.sum([ele[0] * ele[1] for ele in tups]), dtype=int)
    i = 0
    for ele in tups:
        Arr[i:i + ele[0] * ele[1]] = numpy.tile(numpy.arange(ele[0]), ele[1])
        i += ele[0] * ele[1]
    return Arr


arr = func([(2, 3), (3, 4)])
print(arr)
# [0 1 0 1 0 1 0 1 2 0 1 2 0 1 2 0 1 2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...