<p>如果实部和虚部是沿最后一个维度的切片,而数组是沿最后一个维度连续的,则可以</p>
<pre><code>A.view(dtype=np.complex128)
</code></pre>
<p>如果使用单精度浮点,则</p>
<pre><code>A.view(dtype=np.complex64)
</code></pre>
<p>下面是一个更完整的例子</p>
<pre><code>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)
</code></pre>
<p>如果你想摆脱铸件周围的额外尺寸,你可以做一些类似的事情</p>
<pre><code>A_comp = A.view(dtype=np.complex128)[...,0]
</code></pre>
<p>这是因为,在内存中,复数实际上只是两个浮点数。第一个代表实部,第二个代表虚部。
数组的view方法更改数组的dtype,以反映您希望将两个相邻的浮点值视为单个复数,并相应地更新维度。</p>
<p>此方法不会复制数组中的任何值或执行任何新计算,它所做的只是创建一个新的数组对象,该对象以不同的方式查看同一内存块。
这使得此操作可以比任何涉及复制值的操作都快得多。
这也意味着在复数数组中所做的任何更改都将反映在具有实部和虚部的数组中。</p>
<p>如果删除类型转换后立即存在的额外轴,则恢复原始数组可能会有点困难。
像<code>A_comp[...,np.newaxis].view(np.float64)</code>这样的操作目前不起作用,因为在编写本文时,NumPy在添加新轴时没有检测到数组仍然是C-连续的。
见<a href="https://github.com/numpy/numpy/issues/4360">this issue</a>。
<code>A_comp.view(np.float64).reshape(A.shape)</code>似乎在大多数情况下都有效。</p>