<blockquote>
<p>"I stored it in a deeply nested dictionary"</p>
</blockquote>
<p>而且,正如你所看到的,结果并不好。在</p>
<p>还有什么选择?在</p>
<ol>
<li><p>复合键和浅字典。您有一个8部分的密钥:
(单个、成像会话、成像区域、文件时间戳、文件属性、图像感兴趣区域、数据格式、采集通道)映射
值数组。在</p>
<pre><code>{ ('AS091209M02', '100113', 'R16', '1263399103', 'Responses', 'N01', 'Sequential', 'Ch1' ): array,
...
</code></pre>
<p>问题在于搜索。</p></li>
<li><p>适当的阶级结构。实际上,一个完整的类定义可能有点过头了。</p></li>
</ol>
<blockquote>
<p>"The type of operations I perform is for instance to compute properties of the arrays
(listed under Ch1, Ch2), pick up arrays to make a new collection, for instance analyze
responses of N01 from region 16 (R16) of a given individual at different time points, etc."</p>
</blockquote>
<p><strong>推荐</strong></p>
<p>首先,使用<code>namedtuple</code>作为最终对象。在</p>
^{pr2}$
<p>或者类似的事情。构建这些命名元组对象的简单列表。然后您可以简单地迭代它们。在</p>
<p>其次,在这个数组对象的主列表上使用许多简单的map reduce操作。在</p>
<p>过滤:</p>
<pre><code>for a in theMasterArrrayList:
if a.region = 'R16' and interest = 'N01':
# do something on these items only.
</code></pre>
<p>按公用密钥还原:</p>
<pre><code>individual_dict = defaultdict(list)
for a in theMasterArrayList:
individual_dict[ a.individual ].append( a )
</code></pre>
<p>这将在映射中创建一个子集,该子集正好包含所需的项。在</p>
<p>然后,你可以单独做一个句子['AS091209M02',并获得他们所有的数据。您可以对任何(或所有)可用密钥执行此操作。在</p>
<pre><code>region_dict = defaultdict(list)
for a in theMasterArrayList:
region_dict[ a.region ].append( a )
</code></pre>
<p>这不会复制任何数据。它速度快,内存相对紧凑。在</p>
<p>映射(或变换)阵列:</p>
<pre><code>for a in theMasterArrayList:
someTransformationFunction( a.data )
</code></pre>
<p>如果你可以更新一个完整的数组而不破坏列表本身。如果您需要从现有数组创建一个新数组,那么您正在创建一个新的元组。这没什么错,但它是一个新的元组。你最终会得到这样的程序。在</p>
<pre><code>def region_filter( array_list, region_set ):
for a in array_list:
if a.region in region_set:
yield a
def array_map( array_list, someConstant ):
for a in array_list:
yield Array( *(a[:8] + (someTranformation( a.data, someConstant ),) )
def some_result( array_list, region, someConstant ):
for a in array_map( region_filter( array_list, region ), someConstant ):
yield a
</code></pre>
<p>你可以建立转换,减少,映射到更复杂的东西。在</p>
<p>最重要的是从主列表中只创建您需要的字典,这样您就不会做任何超出最低限度的过滤。在</p>
<p>顺便说一句,这可以简单地映射到关系数据库。它会比较慢,但是您可以有多个并发的更新操作。除了多个并发更新外,关系数据库不提供任何高于此的特性。在</p>