Как это присваивание массивов numpy работает: цель [выполнено] = вознаграждение [выполнено], где 'выполнено' также является массивом numpy - PullRequest
0 голосов
/ 03 февраля 2020

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

target = np.zeros(3, dtype=np.float32)
target[0], target[1], target[2] = 10., 20., 30.

rewards = np.zeros(3, dtype=np.float32)
rewards[0], rewards[1], rewards[2] = 55., 65 , 75

done = np.zeros(3, dtype=np.uint8)
done[0], done[1], done[2] = 0, 0, 0

print('Target: ', target, '  Rewards: ', rewards, '  Done: ', done)

Target:  [10. 20. 30.]   Rewards:  [55. 65. 75.]   Done:  [0 0 0]

Тогда target назначается ...

target[done] = rewards[done]
print('Target: ', target, '  Rewards: ', rewards, '  Done: ', done)

Target:  [55. 20. 30.]   Rewards:  [55. 65. 75.]   Done:  [0 0 0]

Обратите внимание на 1-й элемент из цель теперь является 1-м элементом награды . Как это произошло?

Если я теперь сброслю target и , то награждает к начальным значениям и изменим, скажем, на 0, 0, 1

target = np.zeros(3, dtype=np.float32)
target[0], target[1], target[2] = 10., 20., 30.

rewards = np.zeros(3, dtype=np.float32)
rewards[0], rewards[1], rewards[2] = 55., 65 , 75

done = np.zeros(3, dtype=np.uint8)
done[0], done[1], done[2] = 0, 0, 1

print('Target: ', target, '  Rewards: ', rewards, '  Done: ', done)

Target:  [10. 20. 30.]   Rewards:  [55. 65. 75.]   Done:  [0 0 1]

и затем выполнить

target[done] = rewards[done]
print('Target: ', target, '  Rewards: ', rewards, '  Done: ', done)

Я получаю первые 2 элемента наград в цель .

Target:  [55. 65. 30.]   Rewards:  [55. 65. 75.]   Done:  [0 0 1]

Я пробовал разные Комбинации 0 и 1 выполнены, но корреляции не видно.

1 Ответ

0 голосов
/ 03 февраля 2020

https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#integer -array-indexing

Когда вы индексируете массив целочисленным массивом, результатом является перестановочное представление исходного массива, если это имеет смысл.

Допустим, у вас есть

A = [a, b, c, d]
B = [s, t, u, v]
I = [0, 0, 0, 1]

, затем

A[I] = [a, a, a, b]

и

B[I] = [s, s, s, t]

, поэтому, когда вы делаете A [I] = B [I ], вы копируете s в a, а t в b.

...