首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >np.abs可以接受实数[(‘dtype=’,'<f8'),('imag','<f8')]的输入数组并给出绝对值吗?

np.abs可以接受实数[(‘dtype=’,'<f8'),('imag','<f8')]的输入数组并给出绝对值吗?
EN

Stack Overflow用户
提问于 2020-09-10 14:41:33
回答 1查看 460关注 0票数 1

我正在尝试将一些代码从MATLAB移植到Python。MATLAB使用abs(数据)来获得数据中复数的绝对值。我使用h5py模块将其放入ndarray(dim - (151402, 16, 64))中。这个数组包含实数和图像的值,我想要计算它们的绝对值。Numpy文档建议使用np.abs函数,但在此ndarray上使用时,我会得到以下结果

代码语言:javascript
运行
复制
error --> `numpy.core._exceptions.UFuncTypeError: ufunc 'absolute' did 
not contain a loop with signature matching types 
dtype([('real', '<f8'), ('imag', '<f8')]) -> dtype([('real', '<f8'), ('imag', '<f8')])`. 

这是否意味着np.abs无法计算此数据的绝对值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-10 14:58:25

对于复杂的数据类型数组,np.abs会生成幅值,如其文档中所述:

代码语言:javascript
运行
复制
In [18]: x= np.array(1.1 - 0.2j)
In [19]: x
Out[19]: array(1.1-0.2j)
In [20]: x.dtype
Out[20]: dtype('complex128')
In [21]: np.abs(x)
Out[21]: 1.118033988749895

但是您已经将这个复杂的数组构造(或加载)为一个structured array,其中包含单独的realimag字段。np.abs没有为这样的compound dtype定义(大多数计算/ufunc不适用于结构化数组)。

代码语言:javascript
运行
复制
In [23]: dt = np.dtype([('real', '<f8'), ('imag', '<f8')])
In [24]: y = np.array((1.1, -0.2), dt)
In [25]: y
Out[25]: array((1.1, -0.2), dtype=[('real', '<f8'), ('imag', '<f8')])
In [26]: np.abs(y)
Traceback (most recent call last):
  File "<ipython-input-26-e2973663f413>", line 1, in <module>
    np.abs(y)
UFuncTypeError: ufunc 'absolute' did not contain a loop with signature matching types dtype([('real', '<f8'), ('imag', '<f8')]) -> dtype([('real', '<f8'), ('imag', '<f8')])

转换为复杂数据类型:

代码语言:javascript
运行
复制
In [27]: np.abs(y['real']+y['imag']*1j)
Out[27]: 1.118033988749895

或者,我们可以使用view来转换数据类型:

代码语言:javascript
运行
复制
In [28]: y.view('complex')
Out[28]: array(1.1-0.2j)
In [29]: np.abs(y.view('complex'))
Out[29]: 1.118033988749895

view并不总是适用于复合数据类型,但这里的底层数据字节布局是相同的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63824097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档