【发布时间】:2013-05-29 17:15:32
【问题描述】:
我有一个像这样定义的 3D 复杂 numpy 数组:
> import numpy as np
> a = np.random.rand(2,3,4) + np.random.rand(2,3,4) * 1j
> a
array([[[ 0.40506245+0.68587874j, 0.74700976+0.73208816j,
0.42010818+0.31124884j, 0.27181199+0.54599156j],
[ 0.29457621+0.34057513j, 0.82490182+0.63943948j,
0.46887722+0.12734375j, 0.77184637+0.21522095j],
[ 0.67774944+0.8208908j , 0.41476702+0.85332392j,
0.10084665+0.56146324j, 0.71325041+0.77306548j]],
[[ 0.77843387+0.23660274j, 0.23671262+0.63997834j,
0.60831419+0.41741288j, 0.53870756+0.13747055j],
[ 0.12477767+0.54603678j, 0.60537090+0.89208227j,
0.16027151+0.17575777j, 0.18801875+0.27282324j],
[ 0.82308271+0.97238411j, 0.47458327+0.75200695j,
0.16085009+0.60620705j, 0.79766571+0.76470634j]]])
我需要以某种类似于 MATLAB 的特定格式将其打印到字符串 s,我发现的最佳方法如下:(对我来说,描述格式的最佳方法是使用此代码)
> s = ''
> for k in range(a.shape[2]):
> for j in range(a.shape[1]):
> for i in range(a.shape[0]):
> s += str(a[i,j,k].real) + ' '
> for j in range(a.shape[1]):
> for i in range(a.shape[0]):
> s += str(a[i,j,k].imag) + ' '
我对这段看起来不太“pythonic”的代码不满意(我来自 C++,对 Python 了解不多)。我确信 Python 提供了一些可以在这里使用的很好的语法(例如列表推导),但我对它不是很熟悉。
因此我的问题如下:如何改进此代码以使其更加 Pythonic?
编辑: 这个 3D 数组被视为 2×3 复数矩阵的数组。格式包括打印第一个矩阵的实部,然后是虚部,然后以这种方式遍历每个矩阵。
这是您在 MATLAB 中运行此代码时得到的格式:
> a = rand(2,3,4) + rand(2,3,4) * 1i;
> s = sprintf('%g %g ', [real(a) imag(a)]);
我的主要目标是兼容这种格式。
【问题讨论】:
-
我对你的代码感到困惑。您正在打印大多数数字的实部,然后是大多数数字的虚部......这真的是您想要的吗?
-
是的,代码以所需的格式打印数组。
-
@DSM 请将此作为答案发布...
标签: python arrays string numpy