漂亮的写和打印numpy ndarray(Python)的字符串元素

时间:2016-12-11 16:06:43

标签: python string python-3.x numpy

假设我们有一个带numpy.str_元素的numpy.ndarray。例如,下面的arr是numpy.ndarray,有四个像这样的numpy.str_元素:

>>> print(arr)
['\tSTART\t  0\n'  '12345 ABCDEFG'  '1A 2B3C'  '\nE N D']

我是否可以将<{1}}的内容}写入文件而不 arr[和< em>没有每个]元素的'

就是这样, numpy.str_

arr

另外,我可以打印 \tSTART\t 0\n12345 ABCDEFG1A 2B3\nE N D 数组每行一个元素的元素吗?理想情况下,这里也没有numpy[没有 ]

就是这样,打印 '

arr

修改

(1)如果试试这个

\tSTART\t  0\n
12345 ABCDEFG
1A 2B3
\nE N D

我得到了

with open(resultfile, 'w') as f:
    f.write(str(arr))

(2)如果我尝试这个(按照GreenHawk1220的回答建议)

['\tSTART\t  0\n'  '12345 ABCDEFG'  '1A 2B3C'  '\nE N D']

我得到没有(并且该文件没有任何内容)。

1 个答案:

答案 0 :(得分:2)

制作阵列:

In [2]: arr = np.array(['\tSTART\t  0\n',  '12345 ABCDEFG',  '1A 2B3C',  '\nE N D'])
In [3]: 
In [3]: arr
Out[3]: 
array(['\tSTART\t  0\n', '12345 ABCDEFG', '1A 2B3C', '\nE N D'], 
      dtype='<U13')

加入一个字符串;相当于''.join(arr.tolist())(实际为''.join(list(arr))

In [4]: ''.join(arr)
Out[4]: '\tSTART\t  0\n12345 ABCDEFG1A 2B3C\nE N D'

print/str表示扩展于\n\t

In [5]: print(''.join(arr))
    START     0
12345 ABCDEFG1A 2B3C
E N D

repr引用它们:

In [6]: print(repr(''.join(arr)))
'\tSTART\t  0\n12345 ABCDEFG1A 2B3C\nE N D'

f.write有同样的问题:

In [8]: with open('test.txt','w') as f:
   ...:     f.write(''.join(arr))
   ...:     f.write('\n')
   ...:     
In [9]: cat test.txt
    START     0
12345 ABCDEFG1A 2B3C
E N D
In [10]: with open('test.txt','w') as f:
    ...:     f.write(repr(''.join(arr)))
    ...:     f.write('\n')
    ...:     
In [11]: cat test.txt
'\tSTART\t  0\n12345 ABCDEFG1A 2B3C\nE N D'

这实际上不是字符串数组问题。这是一个如何打印/写入包含\n\t的字符串的问题。

评论之后:

In [18]: with open('test.txt','wb') as f:
    ...:     f.write(''.join(arr).encode('unicode_escape'))
    ...:     f.write(b'\n')
In [19]: cat test.txt
\tSTART\t  0\n12345 ABCDEFG1A 2B3C\nE N D

以及各个字符串:

In [21]: with open('test.txt','wb') as f:
    ...:     for s in arr:
    ...:         f.write(s.encode('unicode_escape'))
    ...:         f.write(b'\n')
    ...:         
In [22]: cat test.txt
\tSTART\t  0\n
12345 ABCDEFG
1A 2B3C
\nE N D

为了防止它不明显,我正在使用Ipython和Py3。 Py2可能不同。

encode创建一个带有额外\\t等字节的字符串。.decode可用于将其转换为unicode以进行整洁打印:

In [6]: for s in arr: print(s.encode('unicode_escape').decode())
\tSTART\t  0\n
12345 ABCDEFG
1A 2B3C
\nE N D