回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>假设我有两个列表(长度始终相同):</p>
<pre><code>l0 = [0, 4, 4, 4, 0, 0, 0, 8, 8, 0]
l1 = [0, 1, 1, 1, 0, 0, 0, 8, 8, 8]
</code></pre>
<p>在比较这些列表元素时,我需要应用以下交叉点和并集规则:</p>
<pre><code># union and intersect
uni = [0]*len(l0)
intersec = [0]*len(l0)
for i in range(len(l0)):
if l0[i] == l1[i]:
uni[i] = l0[i]
intersec[i] = l0[i]
else:
intersec[i] = 0
if l0[i] == 0:
uni[i] = l1[i]
elif l1[i] == 0:
uni[i] = l0[i]
else:
uni[i] = [l0[i], l1[i]]
</code></pre>
<p>因此,期望的输出是:</p>
<pre><code>uni: [0, [4, 1], [4, 1], [4, 1], 0, 0, 0, 8, 8, 8]
intersec: [0, 0, 0, 0, 0, 0, 0, 8, 8, 0]
</code></pre>
<p>虽然这是可行的,但我需要使用几百个非常大的列表(每个列表都有数千个元素)来实现这一点,所以我正在寻找一种方法来将其矢量化。我试着使用<code>np.where</code>和各种掩蔽策略,但效果并不理想。任何建议都欢迎。你知道吗</p>
<p><strong>*编辑*</strong></p>
<p>关于</p>
<pre><code>uni: [0, [4, 1], [4, 1], [4, 1], 0, 0, 0, 8, 8, 8]
</code></pre>
<p>与</p>
<pre><code>uni: [0, [4, 1], [4, 1], [4, 1], 0, 0, 0, 8, 8, [0, 8]]
</code></pre>
<p>我仍然在和我心目中的8对[0,8]作战。列表来自系统注释中的BIO标记(参见<a href="https://en.wikipedia.org/wiki/Inside%E2%80%93outside%E2%80%93beginning_(tagging)" rel="nofollow noreferrer">IOB labeling of text chunks</a>),其中每个列表元素是文档中的字符索引,vakue是指定的枚举标签。0表示不表示注释的标签(即,用于确定混淆矩阵中的负数);而非零元素表示为该字符指定的枚举标签。既然我忽略了真正的否定,我想我可以说8相当于[0,8]。至于这是否简化了事情,我还不确定。你知道吗</p>
<p><strong>*编辑2*</strong></p>
<p>我用<code>[0, 8]</code>来保持事物的简单,并且保持<code>intersection</code>和<code>union</code>的定义与集合论一致。你知道吗</p>