<p>小心混合数组和列表操作。你知道吗</p>
<p>制作一些3元素数组,并像第一种情况一样将它们组合起来:</p>
<pre><code>In [748]: r1,r2,r3,r4=np.arange(3),np.ones(3),np.zeros(3),np.arange(3)[::-1]
In [749]: x1=np.array((r1,r2))
In [750]: x2=np.array((r3,r4))
In [751]: rays=[x1,x2]
In [752]: rays
Out[752]:
[array([[ 0., 1., 2.],
[ 1., 1., 1.]]), array([[ 0., 0., 0.],
[ 2., 1., 0.]])]
</code></pre>
<p><code>rays</code>现在是一个包含两个2d数组((2,3)形状)的列表。正如您所说的,您可以从该列表中选择一个项目或向其附加另一个数组(您可以向其附加任何内容,而不仅仅是一个类似的数组)。<code>rays</code>的操作是列表操作。你知道吗</p>
<p>也可以创建三维阵列:</p>
<pre><code>In [758]: ray_arr=np.array((x1,x2))
In [759]: ray_arr
Out[759]:
array([[[ 0., 1., 2.],
[ 1., 1., 1.]],
[[ 0., 0., 0.],
[ 2., 1., 0.]]])
In [760]: ray_arr.shape
Out[760]: (2, 2, 3)
In [761]: ray_arr[-1]
Out[761]:
array([[ 0., 0., 0.],
[ 2., 1., 0.]])
</code></pre>
<p>您可以从<code>ray_arr</code>中进行选择。但是追加需要通过<code>np.concatenate</code>(可能隐藏在<code>np.append</code>函数中)创建一个新数组。列表中没有“就地”附加。你知道吗</p>
<p>通过索引最后一个维度,有效地选择所有组件数组的最后一个元素。你知道吗</p>
<pre><code>In [762]: ray_arr[:,:,-1]
Out[762]:
array([[ 2., 1.],
[ 0., 0.]])
</code></pre>
<p>要从列表<code>rays</code>中获得相应的值,必须使用列表理解(或其他循环):</p>
<pre><code>In [765]: [r[:,-1] for r in rays]
Out[765]: [array([ 2., 1.]), array([ 0., 0.])]
</code></pre>
<p>没有像数组那样的索引快捷方式。你知道吗</p>
<p>有像<code>zip</code>(和<code>itertools</code>中的其他工具)这样的工具可以帮助您遍历列表,甚至重新排列值,例如</p>
<pre><code>In [773]: list(zip(['a','b'],['c','d']))
Out[773]: [('a', 'c'), ('b', 'd')]
In [774]: list(zip(['a','b'],['c','d']))[-1]
Out[774]: ('b', 'd')
</code></pre>
<p>以及参差不齐的子列表:</p>
<pre><code>In [782]: list(zip(['a','b','c'],['d']))
Out[782]: [('a', 'd')]
In [783]: list(itertools.zip_longest(['a','b','c'],['d']))
Out[783]: [('a', 'd'), ('b', None), ('c', None)]
</code></pre>
<p>但我看不出这些对从光线向量中提取值有什么帮助。你知道吗</p>
<hr/>
<p>值得探索的是,将基向量收集到一个2d数组中,并将索引用于各种用途的额外组</p>
<pre><code>In [867]: allrays=np.array([r1,r2,r3,r4])
In [868]: allrays
Out[868]:
array([[ 0., 1., 2.],
[ 1., 1., 1.],
[ 0., 0., 0.],
[ 2., 1., 0.]])
</code></pre>
<p>所有射线的“z”坐标</p>
<pre><code>In [869]: allrays[:,-1]
Out[869]: array([ 2., 1., 0., 0.])
</code></pre>
<p>光线的一个子集(因为它是一个切片,所以它是一个视图)</p>
<pre><code>In [871]: allrays[0:2,:]
Out[871]:
array([[ 0., 1., 2.],
[ 1., 1., 1.]])
</code></pre>
<p>另一个子集:</p>
<pre><code>In [872]: allrays[2:,:]
Out[872]:
array([[ 0., 0., 0.],
[ 2., 1., 0.]])
</code></pre>
<p>3项子集,用列表选择-这是一个副本</p>
<pre><code>In [873]: allrays[[0,1,2],:]
Out[873]:
array([[ 0., 1., 2.],
[ 1., 1., 1.],
[ 0., 0., 0.]])
In [874]: allrays[[3],:]
Out[874]: array([[ 2., 1., 0.]])
</code></pre>
<p>通过索引获得的几个子集:</p>
<pre><code>In [875]: ind=[[0,1,2],[3]]
In [876]: [allrays[i] for i in ind]
Out[876]:
[array([[ 0., 1., 2.],
[ 1., 1., 1.],
[ 0., 0., 0.]]),
array([[ 2., 1., 0.]])]
</code></pre>
<p>如果组是连续的,则可以使用<code>split</code>:</p>
<pre><code>In [884]: np.split(allrays,[3])
Out[884]:
[array([[ 0., 1., 2.],
[ 1., 1., 1.],
[ 0., 0., 0.]]), array([[ 2., 1., 0.]])]
</code></pre>
<p>子阵列是视图(使用<code>.__array_interface__</code>属性检查)。你知道吗</p>
<p>实际上,它只是将不完整的列表问题提升了一个层次。不过,还有更多的灵活性。您可以构造其他索引子列表,例如</p>
<pre><code>In [877]: ind1=[i[-1] for i in ind] # last of all groups
In [878]: ind1
Out[878]: [2, 3]
In [879]: ind2=[i[0] for i in ind] # first of all groups
In [880]: ind2
Out[880]: [0, 3]
</code></pre>
<p>您可以将一些新值连接到<code>allrays</code>。然后您可能需要重建索引列表。但我怀疑这类建筑是一次建成,而通道是重复的。你知道吗</p>
<hr/>
<p>我想到了一个关于从<code>plt.pcolormesh</code>(和<code>plt.pcolor</code>)产生的<code>img</code>访问值的问题。一种是将图像作为二维网格上的曲面进行维护,另一种则更一般,只是四边形的集合,每个四边形都有一个颜色和路径来定义其边界。你知道吗</p>