2016-07-30 2 views
3

Я хотел бы Умножая int16 массив, но в float массив, с автоматическим округлением, но это не удается:Умножить Numpy ИНТ и поплавок массивы

import numpy 

A = numpy.array([1, 2, 3, 4], dtype=numpy.int16) 
B = numpy.array([0.5, 2.1, 3, 4], dtype=numpy.float64) 

A *= B 

я получаю:

TypeError: Cannot cast ufunc multiply output from dtype('float64') to dtype('int16') with casting rule 'same_kind'

+0

Кажется, это возможно с помощью 'numpy.multiply (A, B, out = A, casting = 'unsafe')', но это намного более синтаксис! Есть ли способ установить casting = 'unsafe' в numpy по умолчанию? – Basj

+0

См. Https://github.com/numpy/numpy/pull/6499/files – Basj

ответ

2

Вы могли бы используйте broadcasting для умножения двух массивов и возьмите только целую часть следующим образом:

In [2]: (A*B).astype(int) 
Out[2]: array([ 0, 4, 9, 16]) 

Временные ограничения:

In [8]: %timeit (A*B).astype(int) 
1000000 loops, best of 3: 1.65 µs per loop 

In [9]: %timeit np.multiply(A, B, out=A, casting='unsafe') 
100000 loops, best of 3: 2.01 µs per loop 
+0

OP хочет сделать умножение на месте –

+0

Насколько быстро он сравнивается с 'numpy.multiply (A, B, out = A, casting = 'небезопасно') '? – Basj

+0

@ali_m Нигде OP не упоминает, что они хотят сделать размножение на месте. Их единственным комментарием было то, что более длинный путь был «намного более длинным синтаксисом». – SethMMorton

2
import numpy as np 

A = np.float_(A) 
A *= B 

попробовать это. Я думаю, что это другой тип массива, который вы терпите неудачу.

Cast

1

2 способа решения этой:

Вы можете решить эту проблему путем замены

A *= B 

с

A = (A * B) 

или

numpy.multiply(A, B, out=A, casting='unsafe') 
Смежные вопросы