<p>我还没有完全了解您的嵌套if代码,但这里有一种方法可以识别满足特定条件的结构化数组中的记录</p>
<p>制作一个包含3个字段的示例数组:</p>
<pre><code>In [447]: dt = np.dtype('S10,S10,int')
In [448]: data = np.ones((10,),dt)
In [451]: data['f0']='one two three four five six seven eight nine ten'.split()
In [452]: data['f1']='a b c a b c a b c a'.split()
In [453]: data['f2']=np.arange(10)
In [454]: data
Out[454]:
array([(b'one', b'a', 0), (b'two', b'b', 1), (b'three', b'c', 2),
(b'four', b'a', 3), (b'five', b'b', 4), (b'six', b'c', 5),
(b'seven', b'a', 6), (b'eight', b'b', 7), (b'nine', b'c', 8),
(b'ten', b'a', 9)],
dtype=[('f0', 'S10'), ('f1', 'S10'), ('f2', '<i4')])
</code></pre>
<p>测试一个字段:</p>
<pre><code>In [461]: cond = data['f0']==b'three'
In [462]: cond
Out[462]: array([False, False, True, False, False, False, False, False, False, False], dtype=bool)
</code></pre>
<p>另一个具有多个匹配项的字段:</p>
<pre><code>In [463]: cond = data['f1']==b'c'
In [464]: cond
Out[464]: array([False, False, True, False, False, True, False, False, True, False], dtype=bool)
</code></pre>
<p>结合多个现场测试:</p>
<pre><code>In [465]: cond = (data['f1']==b'c') & (data['f0']==b'three') & (data['f2']==2)
In [466]: cond
Out[466]: array([False, False, True, False, False, False, False, False, False, False], dtype=bool)
In [467]: data[cond]
Out[467]:
array([(b'three', b'c', 2)],
dtype=[('f0', 'S10'), ('f1', 'S10'), ('f2', '<i4')])
</code></pre>
<p>或者走sql路线:</p>
<pre><code>In [468]: import sqlite3
In [469]: conn=sqlite3.connect(':memory:')
In [470]: cur = conn.cursor()
In [471]: cur.execute('''CREATE TABLE array (f0 str, f1 str, f2 int)''')
Out[471]: <sqlite3.Cursor at 0xaa0a38a0>
In [472]: cur.executemany("INSERT INTO array VALUES (?,?,?)",data)
</code></pre>
<p><code>data</code>的元素看起来就像一个元组;因此插入很简单。你知道吗</p>
<pre><code>Out[472]: <sqlite3.Cursor at 0xaa0a38a0>
In [473]: cur.execute('select * from array')
Out[473]: <sqlite3.Cursor at 0xaa0a38a0>
In [474]: cur.fetchall()
Out[474]:
[(b'one', b'a', b'\x00\x00\x00\x00'),
(b'two', b'b', b'\x01\x00\x00\x00'),
(b'three', b'c', b'\x02\x00\x00\x00'),
...
(b'ten', b'a', b'\t\x00\x00\x00')]
In [486]: cur.execute('select * from array where f0==(?)',(b"four",))
Out[486]: <sqlite3.Cursor at 0xaa0a38a0>
In [487]: cur.fetchall()
Out[487]: [(b'four', b'a', b'\x03\x00\x00\x00')]
In [488]: cur.execute('select * from array where f0==(?) or f1==(?)',(b"four",b"c"))
Out[488]: <sqlite3.Cursor at 0xaa0a38a0>
In [489]: cur.fetchall()
Out[489]:
[(b'three', b'c', b'\x02\x00\x00\x00'),
(b'four', b'a', b'\x03\x00\x00\x00'),
(b'six', b'c', b'\x05\x00\x00\x00'),
(b'nine', b'c', b'\x08\x00\x00\x00')]
</code></pre>
<p>这个例子需要更清晰一些,但它给出了可能的大致概念。你知道吗</p>