Почему два метода умножения массивов дают разные ответы? - PullRequest
0 голосов
/ 31 января 2019

В этом небольшом примере две переменные "res" дают разные результаты.Может кто-нибудь объяснить, почему это так?Я ожидаю, что они оба вернут примерно 5.

import numpy as np
import matplotlib.pyplot as plt

dist1 = np.random.normal(100., 10., 10000)
dist2 = np.random.normal(0.05, 0.005, 10000)

res1 = dist1
res1 *= dist2

res2 = dist1 * dist2

print np.median(res1)
print np.median(res2)

# 4.986893617080765
# 0.24957162692779786

1 Ответ

0 голосов
/ 31 января 2019

res1 = dist1 делает не копировать dist1.Вы модифицируете его с помощью *=, следовательно, это две разные операции.

Используйте copy для копирования массива:

>>> dist1 = np.random.normal(100., 10., 10000)
>>> dist2 = np.random.normal(0.05, 0.005, 10000)
>>> 
>>> res1 = dist1.copy()
>>> res1 *= dist2
>>> 
>>> res2 = dist1 * dist2
>>> 
>>> print(np.median(res1))
4.970902419879373
>>> print(np.median(res2))
4.970902419879373

Просто подсказка: "переменные"в python просто имена (т.е. ссылки) для объектов.Они не представляют область памяти.Таким образом:

res1 = dist1

Вы просто даете новое имя объекту с именем dist1, и теперь этот объект имеет два имени (res1 и dist1) и может быть доступен как.

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

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