【问题标题】:Numpy arrays, fancy indexing, complex numbersNumpy 数组、花式索引、复数
【发布时间】:2012-08-15 06:52:37
【问题描述】:

以下代码将数组的一部分乘以一个数字

def mul_by_num(a,b):
    a[0:2] *= b


import numpy as np
a = np.ones(5,dtype=np.float64)
mul_by_num(a,1.0)
mul_by_num(a,1j) #Generates a warning (and casts to float!)

第二次调用产生警告

-c:2: ComplexWarning: Casting complex values to real discards the imaginary part

问题是,将 numpy 数组的一部分乘以复数/实数而不弄乱 dtype 的最 Pythonic 方法是什么?我并不是真的想从一开始就将数组转换为复数,但程序原则上可以获得复数输入。

编辑:

我不关心复制整个数组,将其转换为复数;但我想避免检查 dtypes(即 np.float32、np.float64、np.complex、np.int 等)

【问题讨论】:

  • 我想你会发现没有。
  • @IgnacioVazquez-Abrams 我对这个问题添加了一条评论,我只是想避免对可能的 dtypes 进行全面检查。例如,a + b 可以正常工作,但分配数组的一部分则不行。

标签: python numpy


【解决方案1】:

您需要在某个时候将数组转换为复数,否则它将无法保存复数。

将数组转换为复数的最简单方法是添加0j

if (np.iscomplexobj(b)):
    a = a + 0j
a[0:2] *= b

注意:不是a += 0j,因为它会尝试就地修改数组,如果它还不是很复杂,这将不起作用。

【讨论】:

  • 没关系,但是如果 b 是实数,我不想在这种情况下转换成复数呢?
  • @IvanOseledets 在这种情况下请检查np.iscomplexobj(b)
【解决方案2】:

由于提高了计算速度,numpy array 确保具有相同的类型。也许您可以尝试使用 python 列表或强制转换它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 2013-01-01
    • 2018-10-25
    • 1970-01-01
    • 2021-10-24
    相关资源
    最近更新 更多