Подтвердить что ты не робот

Numpy, разность между a = x и a = a/x

Я использую python 2.7.3, когда выполняю следующий фрагмент кода:

import numpy as np

a = np.array([[1,2,3],[4,5,6]])
a = a / float(2**16 - 1)
print a

Это приведет к следующему выводу:

>> array([[1.52590219e-05, 3.05180438e-05, 4.57770657e-05],
>>       [6.10360876e-05, 7.62951095e-05, 9.15541314e-05]])

Точно как и ожидалось, однако, когда я выполняю следующий фрагмент кода:

import numpy as np

a = np.array([[1,2,3],[4,5,6]])
a /= float(2**16 - 1)
print a

Я получаю следующий вывод:

>> array([[0, 0, 0],
>>        [0, 0, 0]])

Я ожидал тот же вывод, что и в предыдущем примере, я не понимаю разные выходы, которые, похоже, являются результатом использования a /= float(2**16 - 1) vs a = a / float(2**16 - 1).

4b9b3361

Ответ 1

Из документации:

Внимание:

На месте операции будут выполняться вычисления с использованием точности, определяемой типом данных двух операндов, но будет тихо опутать результат (если необходимо), чтобы он мог поместиться обратно в массив. Поэтому для смешанных прецизионных вычислений A {op}= B может отличаться от A = A {op} B. Например, предположим a = ones((3,3)). Затем a += 3j отличается от a = a + 3j: в то время как оба они выполняют одно и то же вычисление, a += 3 возвращает результат, чтобы вернуться обратно в a, тогда как a = a + 3j повторно связывает имя a с результатом.

Поскольку ваш массив был массивом целых чисел, при использовании операций на месте результат снова будет уменьшен до целых чисел.

Если вы измените свой массив, чтобы он первоначально хранил поплавки, то результаты (которые являются поплавками) могут быть сохранены в исходном массиве, и ваш код будет работать нормально:

>>> a = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
>>> a /= float(2**16 - 1)
>>> a
array([[  1.52590219e-05,   3.05180438e-05,   4.57770657e-05],
       [  6.10360876e-05,   7.62951095e-05,   9.15541314e-05]])