将numpy int和float数组相乘:无法从dtype转换ufunc multiply输出

Bas*_*asj 11 python arrays floating-point int numpy

我想将一个int16数组乘以一个float数组,并使用自动舍入,但这会失败:

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
Run Code Online (Sandbox Code Playgroud)

我明白了:

TypeError:无法使用强制转换规则'same_kind'将dtype('float64')的ufunc乘法输出转换为dtype('int16')

mak*_*kis 9

解决这个问题的两种方法:

您可以通过替换来解决此问题

A *= B
Run Code Online (Sandbox Code Playgroud)

A = (A * B)
Run Code Online (Sandbox Code Playgroud)

numpy.multiply(A, B, out=A, casting='unsafe')
Run Code Online (Sandbox Code Playgroud)


Nic*_*eli 5

您可以将broadcasting两个数组相乘并仅取整数部分,如下所示:

\n\n
In [2]: (A*B).astype(int)\nOut[2]: array([ 0,  4,  9, 16])\n
Run Code Online (Sandbox Code Playgroud)\n\n

时间限制:

\n\n
In [8]: %timeit (A*B).astype(int)\n1000000 loops, best of 3: 1.65 \xc2\xb5s per loop\n\nIn [9]: %timeit np.multiply(A, B, out=A, casting=\'unsafe\')\n100000 loops, best of 3: 2.01 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n

  • @ali_m我不同意这一点,但基于这个问题和[另一个问题](http://stackoverflow.com/q/38673878/1399279),OP似乎对简洁性比就地更感兴趣手术。话虽如此,我认为他们想要就地操作的假设是好的,因为给出了示例,并且就地保存了必须键入“A =”,但我始终认为等待OP显式地执行会更安全明确他们想要什么,而不是做出假设。 (3认同)