如何打印一个不带方括号的Numpy数组?

52

我想把 a = [1,2,3,4,5] 转换成 a_string = "1 2 3 4 5"。由于真实的 numpy 数组非常大 (50000x200),所以我认为使用 for 循环 太慢了。


查看此链接:https://dev59.com/Pm435IYBdhLWcg3whQg5 - George
3
你确定你真的需要一个大数组的字符串表示吗?为什么需要呢? - user1196549
之后我需要将这个数组和其他三个数组写入文件。所有的数组大小都不同,我必须交替地将它们写入文件,所以我计划使用writeline手动完成。 - Framester
2
真正的问题是为什么np.array2string没有一个选项来抑制方括号。 - daknowles
好问题。您只需要针对一维数组(根据您的示例),二维数组(最常见的情况),三维或n维数组的答案吗? - smci
7个回答

67
你可以使用字符串的join方法:
>>> a = [1,2,3,4,5]
>>> ' '.join(map(str, a))
"1 2 3 4 5"

谢谢,我之前尝试过使用join但没有成功。Map是我缺失的部分。 - Framester
7
我认为更简单的方式是使用迭代器:' '.join(str(n) for n in a) - alexis
这样看起来不错:def float2str(f): return '{:.5f}'.format(f) ' '.join(map(float2str, embeddings_fb.embed_token('.'))) - ben26941
@tito 有没有更快的替代方法来完成同样的事情。对于大数组来说,这种方法非常慢。 - shaifali Gupta
@shaifaliGupta 打印更多地受到I/O的限制,而不是CPU,因此我怀疑替代方法不会更快。 - Mateen Ulhaq

29

np.savetxt

Python 3 (参见):

import numpy as np
import sys

a = np.array([0.0, 1.0, 2.0, 3.0])
np.savetxt(sys.stdout.buffer, a)

Python 2:

import numpy as np
import sys

a = np.array([0.0, 1.0, 2.0, 3.0])
np.savetxt(sys.stdout, a)

输出:

0.000000000000000000e+00
1.000000000000000000e+00
2.000000000000000000e+00
3.000000000000000000e+00

控制精度

使用fmt

np.savetxt(sys.stdout, a, fmt="%.3f")

输出:

0.000
1.000
2.000
3.000 
或者:
np.savetxt(sys.stdout, a, fmt="%i")

输出:

0
1
2
3

返回字符串而不是打印出来

Python 3:

import io
bio = io.BytesIO()
np.savetxt(bio, a)
mystr = bio.getvalue().decode('latin1')
print(mystr, end='')

我们使用latin1,因为文档告诉我们它是默认编码。

Python 2:

import StringIO
sio = StringIO.StringIO()
np.savetxt(sio, a)
mystr = sio.getvalue()
print mystr

一行搞定

或者如果你真的想要一行搞定:

a = np.array([0.0, 1.0, 2.0, 3.0])
np.savetxt(sys.stdout, a, newline=' ')
print()

输出:

0.000000000000000000e+00 1.000000000000000000e+00 2.000000000000000000e+00 3.000000000000000000e+00 

TODO: 这里有一个尾随空格。我所见的唯一解决方案是先保存到字符串中,然后再进行剪切。

在 Python 2.7.15rc1 和 Python 3.6.6 上进行了测试,numpy 版本为 1.13.3。


16

也许有点小技巧,但是我只需在使用np.array2string后切掉它们:

import numpy as np

a = np.arange(0,10)
a_str = np.array2string(a, precision=2, separator=', ')
print(a_str[1:-1])

结果:

    0, 1, 2, 3, 4, 5, 6, 7, 8, 9

np.array2string提供了许多选项,因此您可以设置列宽,这对于处理大量数据非常有用:

np.array2string有很多选项,你可以设置列的宽度,在处理大量数据时非常有用:

a = np.arange(0,15)
a_str = np.array2string(a, precision=2, separator=', ', max_line_width=15)
print(' ' + a_str[1:-1])

提供:

       0,  1,  2,
       3,  4,  5,
       6,  7,  8,
       9, 10, 11,
      12, 13, 14

它会聪明地在数组元素处分割。请注意,在删除初始括号后,附加到字符串开头的空格用于对齐第一行。


5

如果您有一个起始的numpy数组而不是列表(因为您在帖子中提到了“真正的numpy数组”),您可以在数组的字符串表示上使用re.sub

print(re.sub('[\[\]]', '', np.array_str(a)))

假设你的数组a在某个时刻是numpy数组,那么这样做的好处是它也可用于矩阵。


4
Numpy提供了两个函数来完成此任务:array_strarray_repr。您可以选择任意一个使用,下面分别给出示例:
>>> from numpy import arange, reshape, array_str
>>> M = arange(10).reshape(2,5)
>>> M
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
>>> array_str(M)
'[[0 1 2 3 4]\n [5 6 7 8 9]]'
>>> array_repr(M)
'array([[0, 1, 2, 3, 4],\n       [5, 6, 7, 8, 9]])'

这两个函数都经过高度优化,因此应优先考虑使用它们,而不是编写自己的函数。当处理这样大小的数组时,我想你会希望尽可能提高速度。


2
使用内置函数确实有优势,但仍然需要留下括号。因此,这种方法对于其他类似的情况更为优越。+1 - Framester
你说过你需要将字符串保存到文件中。如果你计划从该文件中检索字符串,括号可能会很有用。此外,子字符串和splits()的组合可以去除括号。 - mau5padd

3

如果您正在处理浮点数和二维数组,您也可以执行以下操作:

import numpy as np
np.random.seed(77)

def my_print(x):
    for row in x:
        print(' '.join(map(lambda x: "{:.3f}\t".format(x), row)))

if __name__ == '__main__':
    x = np.random.random(size=(3, 9))
    my_print(x)

这将打印:

0.919    0.642   0.754   0.139   0.087   0.788   0.326   0.541   0.240  
0.545    0.401   0.715   0.837   0.588   0.296   0.281   0.706   0.423  
0.057    0.747   0.452   0.176   0.049   0.292   0.067   0.751   0.064

3
>>> a=np.array([1,2,3,4,5])
>>> print(*a)
1 2 3 4 5

>>> print(str(a)[1:-1])
1 2 3 4 5

与列表相同


str()在数组长度较长时无法正常工作,np.array2string是一种替代方法。 - ZK xxxxx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接