Как проиндексировать несколько значений вместо одного значения, но сохранить форму, как если бы это было одно значение? - PullRequest
1 голос
/ 07 мая 2019

У меня есть проблема, для которой я не могу найти решение относительно некоторого кода Numpy, который я пишу.Чтобы дать некоторое представление, я хочу реализовать задержки в нейронной сети.Нейронная сеть имеет входной массив x, который имеет размер [time, trials, neurons], и я хотел бы назначить определенную временную задержку для каждого нейрона.

Самый простой случай, когда нет задержки, иЯ могу передать свою входную сетевую информацию следующим образом:

import numpy as np

def f(x):
    """ Dummy function so that the code runs """
    return np.mean(x)

# Set up initial state
time, trials, neurons = (100, 256, 16)
x = np.random.rand(time, trials, neurons)

# Iterate through time
for t in range(time):

    # Index into the state in time
    x_ = x[t,:,:]
    y = f(x_)

# Assert shape of indexed array
assert x_.shape == (trials, neurons)

В этом случае, когда я индексирую в определенное время, форма массива x становится [trials, neurons], так как я проиндексировал дляконкретный момент времени.

Теперь я знаю, что могу добавить фиксированную задержку L, целое число, индексируя с помощью x[t-L,:,:], и полученная фигура снова будет [trials, neurons].Результат в основном идентичен приведенному выше коду.

Чтобы усложнить задачу, к сожалению, мой проект требует разной задержки для каждого нейрона.Таким образом, вместо того, чтобы L было некоторым целым числом, я бы хотел, чтобы это был массив значений задержки.В частности, я хотел бы сделать L = np.random.randint(a, b, size=neurons), поэтому каждый элемент L представляет собой некое целое число от a до b, исключительное.

Моя цель - создать идиоматическую кодовую фразу, которая выполняет то же самоепуть как целое число L.Я знаю, что могу легко сделать for цикл по нейронам, чтобы получить неэффективную версию этого, как показано:

import numpy as np

def f(x):
    """ Dummy function so that the code runs """
    return np.mean(x)

# Set up initial state
time, trials, neurons = (100, 256, 16)
a, b = (8, 12)

x = np.random.rand(time, trials, neurons)
L = np.random.randint(a, b, size=neurons)

# Iterate through time
for t in range(time):

    ### This is what I want to optimize ###
    #######################################

    # Index into the state in time, with
    # a different latency for each neuron
    x_ = []
    for n in range(neurons):
        x_.append(x[t-L[n],:,n])
    x_ = np.stack(x_, axis=1)

    #######################################

    # Use the latency-indexed array
    y = f(x_)

# Assert shape of indexed array
assert x_.shape == (trials, neurons)

Таким образом, мой вопрос состоит в том, как добиться всего этого индексации с надеждой простонесколько строк решения Numpy-native.Я пытался злоупотреблять расширенной индексацией в этом отношении, но безрезультатно, и я надеюсь на некоторую помощь в этом вопросе.Ура!

1 Ответ

1 голос
/ 07 мая 2019

Если я вас правильно понимаю, вам просто нужна базовая индексация:

import numpy as np

time, trials, neurons = (100, 256, 16)
a, b = (8, 12)
x = np.random.rand(time, trials, neurons)
L = np.random.randint(a, b, size=neurons)

# let's say the time t=50
x1 = []
for n in range(neurons):
    x1.append(x[50-L[n],:,n])
x1 = np.stack(x1, axis=1)

# use two list to index the intersection, but notice transposing needed.
x2 = x[50-L,:,range(neurons)].T

print(np.all(x1==x2))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...