<p>为了回答您的一般性问题,您可以先创建Numpy数组,而不是定义一堆Python列表(这些列表的附加和处理速度都很慢,尤其是在您扩展分辨率时处理大量的值时)。初始化Numpy数组时,通常需要指定数组的大小,但在这种情况下,这很简单,因为您知道需要多少次传播。例如:</p>
<pre><code>>>> orbitX = np.empty(propNum, dtype=float)
</code></pre>
<p>创建一个由<code>propNum</code>浮点值组成的空Numpy数组(这里的“empty”表示数组没有用任何值初始化这是创建一个新数组的最快方法,因为我们稍后将填充其中的所有值。在</p>
<p>然后在循环中,而不是使用<code>orbitX.append(x)</code>,而是在数组中分配与当前记号相对应的值:<code>orbitX[i] = x</code>。其他情况也一样。在</p>
<p>还有几种方法可以输出数据,但是使用Astropy<a href="http://docs.astropy.org/en/stable/table/index.html" rel="nofollow noreferrer">^{<cd4>}</a>提供了很大的灵活性。可以创建包含所需列的表,例如:</p>
^{pr2}$
<p>拥有Table对象的好处是有大量的输出格式选项。E、 g.在Python提示符下:</p>
<pre><code>>>> table
J2000 lat lon alt
float64 float64 float64 float64
- -
1085.01128806 48.5487129749 -144.175054697 264779.500823
2170.02257613 26.5068122883 -50.3805485685 262446.085716
3255.03386419 -28.7915478311 -1.6090285674 319661.817451
4340.04515225 -48.0536526356 91.5416828221 355717.274021
5425.05644032 0.084422392655 152.811717713 306129.02576
</code></pre>
<p>要先输出到文件,您必须考虑如何格式化数据。已经有很多常见的数据格式可以考虑使用,但这取决于数据的用途以及谁将使用它(“.dat file”在文件格式方面没有任何含义;或者更确切地说,它可能意味着<em>任何</em>)。但在您的问题中,您指出您想要的是所谓的“逗号分隔值”(CSV),其中数据的格式是按列向下排列,行中的每个值都用逗号分隔。<code>Table</code>类可以很容易地输出CSV(以及任何变体):</p>
<pre><code>>>> import sys
>>> table.write(sys.stdout, format='ascii.csv') # Note: I'm just using sys.stdout for demonstration purposes; normally you would give a filename
J2000,lat,lon,alt
1085.011288063746,48.54871297493748,-144.17505469691633,264779.5008225624
2170.022576127492,26.506812288280788,-50.38054856853237,262446.0857159357
3255.0338641912376,-28.79154783108773,-1.6090285674024463,319661.81745081506
4340.045152254984,-48.05365263557444,91.54168282208444,355717.2740210131
5425.05644031873,0.08442239265500713,152.81171771323176,306129.0257600865
</code></pre>
<p>不过,还有很多其他的选择。例如,如果希望数据在对齐列中格式良好,也可以这样做。你可以阅读更多关于它的<a href="http://docs.astropy.org/en/stable/io/unified.html#unified-file-read-write-interface" rel="nofollow noreferrer">here</a>。(另外,我建议,如果您想要纯文本文件格式,可以尝试<code>ascii.ecsv</code>,它的优点是它输出额外的元数据,从而可以轻松地将其读回Astropy表中):</p>
<pre><code>>>> table.write(sys.stdout, format='ascii.ecsv')
# %ECSV 0.9
# -
# datatype:
# - {name: J2000, datatype: float64}
# - {name: lat, datatype: float64}
# - {name: lon, datatype: float64}
# - {name: alt, datatype: float64}
# schema: astropy-2.0
J2000 lat lon alt
1085.01128806 48.5487129749 -144.175054697 264779.500823
2170.02257613 26.5068122883 -50.3805485685 262446.085716
3255.03386419 -28.7915478311 -1.6090285674 319661.817451
4340.04515225 -48.0536526356 91.5416828221 355717.274021
5425.05644032 0.084422392655 152.811717713 306129.02576
</code></pre>
<p>另一件不相关的事我会注意到,除了单个值之外,Astropy中的许多对象可以对整个数组进行操作,这通常会更有效,尤其是对于许多值。特别是,您有一个Python循环:</p>
<pre><code>for i in range(propNum):
xyz = (myOrbitX[i], myOrbitY[i], myOrbitZ[i]) #Xyz coord for each prop. step
now = time.Time(myT[i]) #UTC time at each propagation step
cartrep = coord.CartesianRepresentation(*xyz, unit=u.m) #Add units of [m] to xyz
gcrs = coord.GCRS(cartrep, obstime=time.Time(myT[i])) #Let AstroPy know xyz is in GCRS
itrs = gcrs.transform_to(coord.ITRS(obstime=time.Time(myT[i]))) #Convert GCRS to ITRS
loc = coord.EarthLocation(*itrs.cartesian.xyz) #Get lat/lon/height from ITRS
lat.append(loc.lat.value) #Create latitude list
lon.append(loc.lon.value) #Create longitude list
alt.append(loc.height.value)
</code></pre>
<p>这可以完全重写,无需显式循环,而是将它们视为坐标的<em>数组</em>。例如:</p>
<pre><code>>>> times = time.Time(myT) # All the times, not just a single one
>>> cartrep = coord.CartesianRepresentation(orbitX, orbitY, orbitZ, unit=u.m) # Again, an array of coordinates
>>> gcrs = coord.GCRS(cartrep, obstime=times)
>>> itrs = gcrs.transform_to(coord.ITRS(obstime=ts))
>>> loc = coord.EarthLocation(*itrs.cartesian.xyz) # I'm not sure this is the most efficient way to do this but I'm not an expert on the coordinates package
</code></pre>
<p>用这个我们也可以得到所有的坐标。E、 g.:</p>
<pre><code>>>> loc.lat
<Latitude [ 48.54871297, 26.50681229,-28.79154783,-48.05365264,
0.08442239] deg>
</code></pre>
<p>一般来说,这是处理大量坐标值的一种更有效的方法。类似地,在转换原始代码中的<code>myT</code>时,可以创建一个单独的<code>TimeDelta</code>数组并将其添加到初始时间中,而不是在所有时间偏移上循环。在</p>
<p>不幸的是,我不是<code>orbital</code>软件包的专家,但它似乎不像人们希望的那样容易获得轨道上不同点的坐标。就像应该有的。在</p>