<p>第一点困惑。您将显示一个名为dt=<code>[('haloid', '<u8'), ('hostid', '<u8'), ('type', 'i1'),...</code>的<code>dt</code>定义。但是<code>h5</code>负载
是</p>
<pre><code>data_array['name'+str(a)][size_before:new_size] = f['name'+str(a)]
</code></pre>
<p>换言之,该文件包含名称为<code>name0</code>,<code>name1</code>的数据集,您将这些数据集下载到具有相同名称字段的数组中。在</p>
<p>您可以使用</p>
^{pr2}$
<p>例如</p>
<pre><code>In [20]: dt = [('haloid', '<u8'), ('hostid', '<u8'), ('type', 'i1'),
...: ('mstar', '<f8'), ('x_pos', '<f8'), ('y_pos', '<f8'),
...: ('z_pos', '<f8'), ('x_vel', '<f8'), ('y_vel', '<f8'), ('z_vel', '<f8')]
In [21]: arr = np.zeros((3,), dtype=dt)
In [22]: arr
Out[22]:
array([(0, 0, 0, 0., 0., 0., 0., 0., 0., 0.),
(0, 0, 0, 0., 0., 0., 0., 0., 0., 0.),
(0, 0, 0, 0., 0., 0., 0., 0., 0., 0.)],
dtype=[('haloid', '<u8'), ('hostid', '<u8'), ('type', 'i1'), ('mstar', '<f8'), ('x_pos', '<f8'), ('y_pos', '<f8'), ('z_pos', '<f8'), ('x_vel', '<f8'), ('y_vel', '<f8'), ('z_vel', '<f8')])
In [23]: for name in arr.dtype.names:
...: print(name)
...: arr[name] = 1
...:
haloid
hostid
....
In [24]: arr
Out[24]:
array([(1, 1, 1, 1., 1., 1., 1., 1., 1., 1.),
(1, 1, 1, 1., 1., 1., 1., 1., 1., 1.),
(1, 1, 1, 1., 1., 1., 1., 1., 1., 1.)],
dtype=[('haloid', '<u8'), ('hostid', '<u8'), ('type', 'i1'), ('mstar', '<f8'), ('x_pos', '<f8'), ('y_pos', '<f8'), ('z_pos', '<f8'), ('x_vel', '<f8'), ('y_vel', '<f8'), ('z_vel', '<f8')])
In [25]: arr[0] # get one record
Out[25]: (1, 1, 1, 1., 1., 1., 1., 1., 1., 1.)
In [26]: arr[0]['hostid'] # get one field, one record
In [27]: arr['hostid'] # get all values of a field
Out[27]: array([1, 1, 1], dtype=uint64)
In [28]: arr['hostid'][:2] # subset of records
Out[28]: array([1, 1], dtype=uint64)
</code></pre>
<p>因此,按字段名填充结构化数组应该可以正常工作:</p>
<pre><code>arr[name][n1:n2] = file[dataset_name]
</code></pre>
<p>像这样的印刷品:</p>
<blockquote>
<p>structured array:<br/>
print data_array[['haloid','type','hostid']][0][0:3]<br/>
[(12108086595L, 0, 12108086595L) (12108071103L, 0, 12108071103L) (12108069992L, 0, 12108069992L)]</p>
</blockquote>
<p>以及</p>
<blockquote>
<p>[[ (12108086595L, 12108086595L, 0, </p>
</blockquote>
<p>在我看来,结构化的<code>data_array</code>实际上是二维的,是用类似的东西创建的(见问题8)</p>
<pre><code>data_array = np.zeros((10, nr_rows), dtype=dt)
</code></pre>
<p>这是<code>[0][0:3]</code>索引工作的唯一方法</p>
<p>对于二维阵列:</p>
<pre><code>mask = np.where(data[:,col2] > data[:,col1])
</code></pre>
<p>比较两列。当有疑问时,首先查看布尔值<code>data[:,col2] > data[:,col1]</code>。<code>where</code>只返回布尔数组为真的索引。在</p>
<p>掩蔽索引的简单示例:</p>
<pre><code>In [29]: x = np.array((np.arange(6), np.arange(6)[::-1])).T
In [33]: mask = x[:,0]>x[:,1]
In [34]: mask
Out[34]: array([False, False, False, True, True, True], dtype=bool)
In [35]: idx = np.where(mask)
In [36]: idx
Out[36]: (array([3, 4, 5], dtype=int32),)
In [37]: x[mask,:]
Out[37]:
array([[3, 2],
[4, 1],
[5, 0]])
In [38]: x[idx,:]
Out[38]:
array([[[3, 2],
[4, 1],
[5, 0]]])
</code></pre>
<p>在这个结构化示例中,<code>data['x_pos']</code>选择字段。需要<code>[0]</code>来选择该2d数组的第一行(大小为10维)。剩下的比较和where应该和2d数组一样工作。在</p>
<pre><code>mask = np.where(data['x_pos'][0] > data['y_pos'][0]])
</code></pre>
<p>可能不需要<code>where</code>元组上的<code>mask[:][0]</code>。<code>mask</code>是一个元组,<code>[:]</code>生成一个副本,[0]选择第一个元素,它是一个数组。有时可能需要一个<code>arr[idx[0],:]</code>,而不是<code>arr[idx,:]</code>,但不要经常这样做。在</p>
<p>我的第一条评论建议使用单独的数组</p>
<pre><code> dt1 = [('haloid', '<u8'), ('hostid', '<u8'), ('type', 'i1')]
data_id = np.zeros((n,), dtype=dt1)
data = np.zeros((n,m), dtype=float) # m float columns
</code></pre>
<p>甚至是</p>
<pre><code> haloid = np.zeros((n,), '<u8')
hostid = np.zeros((n,), '<u8')
type = np.zeros((n,), 'i1')
</code></pre>
<p>使用这些数组,<code>data_array['hostid'][0]</code>、<code>data_id['hostid']</code>和{<cd21>}都应该返回相同的1d数组,并且在<code>mask</code>表达式中同样可用。在</p>
<p>ids有时保存在数据结构中是很方便的。如果写入/读取<code>csv</code>格式的文件,则尤其如此。但对于蒙面选拔来说,这并没有多大帮助。而对于跨数据域的数据计算来说,这可能是一件痛苦的事。在</p>
<p>我也可以建议一个复合数据类型,一个</p>
<pre><code>dt2 = [('haloid', '<u8'), ('hostid', '<u8'), ('type', 'i1'), ('data', 'f8', (m,))]
In [41]: np.zeros((4,), dtype=dt2)
Out[41]:
array([(0, 0, 0, [ 0., 0., 0.]), (0, 0, 0, [ 0., 0., 0.]),
(0, 0, 0, [ 0., 0., 0.]), (0, 0, 0, [ 0., 0., 0.])],
dtype=[('haloid', '<u8'), ('hostid', '<u8'), ('type', 'i1'), ('data', '<f8', (3,))])
In [42]: _['data']
Out[42]:
array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
</code></pre>
<p>是按列号还是按“x_coor”之类的名称访问浮点数据更好?您需要同时使用多个浮点数列进行计算,还是总是单独访问它们?在</p>