<p>使用文本行列表模拟文件:</p>
<pre><code>In [401]: txt="""\
AAAAAAAAAAAA
BB BBBBBBBBB
CCCCCCCCCCCC
DDDDDD DDDDD
"""
In [402]: txt=txt.splitlines()
In [403]: txt
Out[403]: ['AAAAAAAAAAAA', 'BB BBBBBBBBB', 'CCCCCCCCCCCC', 'DDDDDD DDDDD']
</code></pre>
<p>你怎么把它加载到数组中?我们通常使用<code>loadtxt</code>,但这是针对数据列的</p>
^{pr2}$
<p>没用。在</p>
<p>让我们<code>split</code>在这些行上</p>
<pre><code>In [410]: [x.split() for x in txt]
Out[410]: [['AAAAAAAAAAAA'], ['BB', 'BBBBBBBBB'], ['CCCCCCCCCCCC'], ['DDDDDD', 'DDDDD']]
</code></pre>
<p>带有“空白”的行将变成包含1个以上术语的列表</p>
<pre><code>In [411]: [len(x.split())>1 for x in txt]
Out[411]: [False, True, False, True]
</code></pre>
<p>所以2行有错误。在</p>
<p>我可以通过<code>list()</code>传递字符串,将<code>txt</code>转换为每列一个字母的数组。这给<code>np.array</code>一个列表列表,长度相同。行尾的空白/空白可能会导致问题。在</p>
<pre><code>In [414]: A=np.array([list(x) for x in txt])
In [415]: A
Out[415]:
array([['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'],
['B', 'B', ' ', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B'],
['C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C'],
['D', 'D', 'D', 'D', 'D', 'D', ' ', 'D', 'D', 'D', 'D', 'D']],
dtype='|S1')
</code></pre>
<p>我可以测试这个数组中的<code>' '</code>字符,方法如下:</p>
<pre><code>In [418]: np.any(A==' ',axis=1)
Out[418]: array([False, True, False, True], dtype=bool)
</code></pre>
<p>如果这些行的长度不同,那么这个<code>array</code>将不是2d,而是包含列表的1d。在</p>
<hr/>
<p>正如注释中建议的那样,我可以从整个字符串中创建一个数组,并使用<code>view</code>将它们“分割”成字符。在</p>
<p>带有“非功能”分隔符的<code>loadtxt</code>将创建一个二维数组,如下所示:</p>
<pre><code>In [434]: np.array([[x] for x in txt])
Out[434]:
array([['AAAAAAAAAAAA'],
['BB BBBBBBBBB'],
['CCCCCCCCCCCC'],
['DDDDDD DDDDD']],
dtype='|S12')
</code></pre>
<p>然后把它分成几个字符:</p>
<pre><code>In [435]: np.array([[x] for x in txt]).view('S1')
Out[435]:
array([['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'],
['B', 'B', ' ', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B'],
['C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C'],
['D', 'D', 'D', 'D', 'D', 'D', ' ', 'D', 'D', 'D', 'D', 'D']],
dtype='|S1')
</code></pre>