我有一个复数值的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功能为我做这个?
答案 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])
可能是最好的(最干净,最快)选项。
用于重现情节的代码:
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)],
)