将复数NumPy数组转换为(n,2) - 实部​​和虚部的阵列

时间:2016-08-11 15:20:14

标签: python arrays numpy

我有一个复数值的NumPy数组,我想将其转换为连续的NumPy数组,其中实部和虚部是分开的。

import numpy

u = numpy.array([
    1.0 + 2.0j,
    2.0 + 4.0j,
    3.0 + 6.0j,
    4.0 + 8.0j
    ])

u2 = numpy.ascontiguousarray(numpy.vstack((u.real, u.imag)).T)

可以解决问题,但转置,vstacking,转换为连续数组可能是一两步太多了。

是否有本机NumPy功能为我做这个?

4 个答案:

答案 0 :(得分:4)

您可以使用column_stack并将两个1-D数组堆叠为列来制作单个2D数组。

In [9]: np.column_stack((u.real,u.imag))
Out[9]: 
array([[ 1.,  2.],
       [ 2.,  4.],
       [ 3.,  6.],
       [ 4.,  8.]])

答案 1 :(得分:2)

没有替代方案是native或保存重塑,转置等。

例如,内部column_stack将其输入转换为2d'列'数组。实际上它正在做

In [1171]: np.concatenate((np.array(u.real,ndmin=2).T,np.array(u.imag,ndmin=2).T),axis=1)
Out[1171]: 
array([[ 1.,  2.],
       [ 2.,  4.],
       [ 3.,  6.],
       [ 4.,  8.]])

vstack通过atleast_2d(m)传递其输入,确保每个都是1行2d数组。 np.dstack使用atleast_3d(m)

新功能是np.stack

In [1174]: np.stack((u.real,u.imag),-1)
Out[1174]: 
array([[ 1.,  2.],
       [ 2.,  4.],
       [ 3.,  6.],
       [ 4.,  8.]])

它使用None索引来纠正连接的维度;有效:

np.concatenate((u.real[:,None],u.imag[:,None]),axis=1)

所有人最终都使用np.concatenate;它和np.array是唯一编译的连接函数。

另一个技巧是使用view

In [1179]: u.view('(2,)float')
Out[1179]: 
array([[ 1.,  2.],
       [ 2.,  4.],
       [ 3.,  6.],
       [ 4.,  8.]])

复数值保存为2个相邻的浮点数。因此,相同的数据缓冲区可以被视为纯浮点数,或者将此视图视为2d浮点数组。与concatenate函数相比,此处没有复制。

关于替代方案的另一个测试是询问当u为2d或更高时会发生什么?

答案 2 :(得分:1)

您可以使用SSL_METHOD const * method = SSLv3_server_method();

dstack

答案 3 :(得分:0)

我已经使用perfplot比较了建议的解决方案。对于较大的矢量,使用恒定时间视图

u.view("(2,)float")

确实是最快的变体。对于较小的n

numpy.column_stack([u.real, u.imag])

可能是最好的(最干净,最快)选项。

enter image description here

用于重现情节的代码:

import numpy
import perfplot


def setup(n):
    return numpy.random.rand(n) + 1j * numpy.random.rand(n)


def column_stack(u):
    return numpy.column_stack([u.real, u.imag])


def dstack(u):
    return numpy.dstack((u.real, u.imag))[0]


def concatenate(u):
    return numpy.concatenate(
        (numpy.array(u.real, ndmin=2).T, numpy.array(u.imag, ndmin=2).T), axis=1
    )


def stack(u):
    return numpy.stack((u.real, u.imag), -1)


def view(u):
    return u.view("(2,)float")


perfplot.save(
    "out.png",
    setup=setup,
    kernels=[column_stack, dstack, concatenate, stack, view],
    n_range=[2 ** k for k in range(15)],
)