【问题标题】:Numpy Cannot cast ufunc multiply output from dtypeNumpy 无法从 dtype 转换 ufunc 乘法输出
【发布时间】:2016-12-05 00:56:56
【问题描述】:

我想将 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

我明白了:

TypeError:无法使用转换规则“same_kind”将 ufunc 乘法输出从 dtype('float64') 转换为 dtype('int16')

【问题讨论】:

  • numpy.multiply(A, B, out=A, casting='unsafe') 似乎是可能的,但语法要长得多!有没有办法在numpy中默认设置casting='unsafe'?

标签: python arrays numpy floating-point int


【解决方案1】:

您可以使用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

【讨论】:

  • OP 想就地做乘法
  • numpy.multiply(A, B, out=A, casting='unsafe')相比有多快?
  • @ali_m OP 没有提到他们想要就地进行乘法运算。他们唯一的评论是更长的方式是“更长的语法”。
  • @SethMMorton 好吧,问题中给出的示例和 cmets 中发布的 OP 的解决方法都明确执行了就地乘法。
  • @ali_m 我不同意这一点,但基于这个问题和the other question 似乎 OP 对简洁性比就地操作更感兴趣。话虽如此,我认为他们想要一个就地操作的假设是好的,因为给出的例子和就地节省了必须输入A = ,但我总是认为等待 OP 明确地做出更安全清楚他们想要什么,而不是做出假设。
【解决方案2】:
import numpy as np

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

试试这个。我认为你会失败的不同数组类型。

演员表

【讨论】:

    【解决方案3】:

    解决此问题的两种方法:

    您可以通过替换

    来解决这个问题
    A *= B
    

    A = (A * B)
    

    numpy.multiply(A, B, out=A, casting='unsafe')
    

    【讨论】:

      猜你喜欢
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 2019-10-14
      相关资源
      最近更新 更多