Массив Python numpy: ошибка индекса, индекс выходит за пределы

#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 голоса записываются, но не отображаются публично. Ах, хорошо, я отредактирую вопрос.