从两个真实的数组创建一个复杂的数组?

2024-05-15 23:07:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我发誓这应该很容易。。。为什么不是?:(一)

实际上,我想将同一个数组的两个部分组合起来形成一个复杂的数组:

Data[:,:,:,0] , Data[:,:,:,1]

这些不起作用:

x = np.complex(Data[:,:,:,0], Data[:,:,:,1])
x = complex(Data[:,:,:,0], Data[:,:,:,1])

我遗漏了什么吗?numpy不喜欢对复数执行数组函数吗?错误如下:

TypeError: only length-1 arrays can be converted to Python scalars

Tags: 函数numpyonlydata错误np数组be
3条回答

这似乎是你想要的:

numpy.apply_along_axis(lambda args: [complex(*args)], 3, Data)

下面是另一个解决方案:

# The ellipsis is equivalent here to ":,:,:"...
numpy.vectorize(complex)(Data[...,0], Data[...,1])

还有另一个更简单的解决方案:

Data[...,0] + 1j * Data[...,1]

PS:如果要保存内存(无中间数组):

result = 1j*Data[...,1]; result += Data[...,0]

开发人员下面的解决方案也很快。

如果实部和虚部是沿最后一个维度的切片,而数组是沿最后一个维度连续的,则可以

A.view(dtype=np.complex128)

如果使用单精度浮点,则

A.view(dtype=np.complex64)

下面是一个更完整的例子

import numpy as np
from numpy.random import rand
# Randomly choose real and imaginary parts.
# Treat last axis as the real and imaginary parts.
A = rand(100, 2)
# Cast the array as a complex array
# Note that this will now be a 100x1 array
A_comp = A.view(dtype=np.complex128)
# To get the original array A back from the complex version
A = A.view(dtype=np.float64)

如果你想摆脱铸件周围的额外尺寸,你可以做一些类似的事情

A_comp = A.view(dtype=np.complex128)[...,0]

这是因为,在内存中,复数实际上只是两个浮点数。第一个代表实部,第二个代表虚部。 数组的view方法更改数组的dtype,以反映您希望将两个相邻的浮点值视为单个复数,并相应地更新维度。

此方法不会复制数组中的任何值或执行任何新计算,它所做的只是创建一个新的数组对象,该对象以不同的方式查看同一内存块。 这使得此操作可以比任何涉及复制值的操作都快得多。 这也意味着在复数数组中所做的任何更改都将反映在具有实部和虚部的数组中。

如果删除类型转换后立即存在的额外轴,则恢复原始数组可能会有点困难。 像A_comp[...,np.newaxis].view(np.float64)这样的操作目前不起作用,因为在编写本文时,NumPy在添加新轴时没有检测到数组仍然是C-连续的。 见this issueA_comp.view(np.float64).reshape(A.shape)似乎在大多数情况下都有效。

当然有一点很明显:

Data[...,0] + 1j * Data[...,1]

相关问题 更多 >