#python-3.x #numpy
#python-3.x #numpy
Вопрос:
Следующий код является лишь примером моего исходного кода, который выглядит следующим образом
batch_size = 10
target_q = np.ones((10, 1))
actions = np.ones((10, ), dtype=int)
batch_index = np.arange(batch_size, dtype=np.int32)
print(target_q[batch_index, actions])
print(target_q.shape)
Я получаю следующую ошибку
Ошибка индекса: индекс 1 выходит за пределы оси 1 с размером 1.
Может кто-нибудь, пожалуйста, объяснить, что это значит и как это исправить.
Заранее спасибо.
Ответ №1:
В numpy вы можете индексировать массивы размером N
до индекса N-1
(вдоль заданной оси), в противном случае вы получите ошибку IndexError, которую вы видите. Чтобы проверить, как высоко вы можете подняться с индексом, вы можете распечатать target_q.shape
. В вашем случае он сообщит вам (10, 1)
, что означает, что если вы индексируете target_q[i, j]
, то i
может быть максимально 9 и j
может быть максимально 0. Что вы делаете в своей строке target_q[batch_index, actions]
, так это вставляете действия как так называемую причудливую индексацию на второй позиции ( j
) и actions
она полна единиц. Таким образом, вы пытаетесь много раз индексировать с помощью 1, тогда как максимально допустимое значение индекса равно 0. Что бы сработало, было бы:
import numpy as np
batch_size = 10
target_q = np.ones((10, 1))
# changed to zeros below
actions = np.zeros((10, ), dtype=int)
batch_index = np.arange(batch_size, dtype=np.int32)
print(actions)
print(target_q.shape)
print(target_q[batch_index, 0])
print(target_q[batch_index, actions])
это выводит:
[0 0 0 0 0 0 0 0 0 0]
(10, 1)
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
Комментарии:
1. Спасибо за правильное объяснение. Итак, в моем коде значением действий являются числа[31, 37, 27, 46, 45, 32, 36, 42, 37, 49] и пакетный индекс равен batch_index = np.arange(batch_size, dtype = np.int32) с размером пакета = 10. Я получаю следующую ошибку IndexError: индекс 32 выходит за пределы оси 1 с размером 4. Итак, как бы вы посоветовали мне справиться с преодолением ошибки?
2. Если вы считаете мое объяснение полезным, пожалуйста, поддержите его. Во-вторых, было бы лучше, если бы вы задали свой вопрос с фактическими значениями, которые вы использовали, четкой информацией о том, чего вы пытаетесь достичь, и какой результат вы ожидаете, и какой реальный результат он производит. Тогда будет легче помочь.
3. Хорошо, спасибо. Я проголосовал за. Мой тестовый код предназначен для обучения с подкреплением. Где target_q[batch_index, действия] = награды self.gamma * np.max(next_q, ось = 1)* don. Значения следующие: действие аналогично тому, которое я упомянул в предыдущем комментарии, значение награды равно [ 10. -20. -20. -20. -20. 10. -20. -20. -20. -20.] при форме (10, ) значение gamma равно 0,99, форма next_q равна (10, 4), а значение dones равно [1 1 1 1 1 1 1 1 1 1] с формой (10, ). Значение next_q слишком велико для ввода здесь. Можете ли вы помочь мне с этим? Спасибо
4. Я не думаю, что вы действительно проголосовали! Вы уверены, что знаете, что это значит? Это стрелка вверх рядом с моим ответом. Щелчок по нему изменит «0» на «1», и там все еще будет ноль! Что касается вашей проблемы: мне кажется, вы новичок в Stack Overflow, я имел в виду, что было бы хорошо, если бы вы ОТРЕДАКТИРОВАЛИ свой исходный вопрос, четко объяснив, что вы ожидаете от кода и что он на самом деле делает. Это одно из правил стека, возможно, из-за того, что вы этого не сделали, кто-то отклонил ваши вопросы (и теперь вы можете видеть «-1» рядом с ним).
5. Я проголосовал за, но в нем говорится, что для людей с репутацией менее 15 голоса записываются, но не отображаются публично. Ах, хорошо, я отредактирую вопрос.