Ответ 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]])