Python 如何打印无括号的Numpy数组?

Python 如何打印无括号的Numpy数组?,python,numpy,formatting,numpy-ndarray,Python,Numpy,Formatting,Numpy Ndarray,我想将a=[1,2,3,4,5]转换成a_string=“1 2 3 4 5”。真正的numpy数组相当大(50000x200),因此我假设对循环使用太慢。您可以使用字符串中的join方法: >>> a = [1,2,3,4,5] >>> ' '.join(map(str, a)) "1 2 3 4 5" Numpy为此提供了两个函数,其中任何一个都应该适合您的需要。由于您可以使用这两种方法中的任何一种,下面是每种方法的示例: >>> fr

我想将
a=[1,2,3,4,5]
转换成
a_string=“1 2 3 4 5”
。真正的numpy数组相当大(50000x200),因此我假设对循环使用
太慢。

您可以使用字符串中的
join
方法:

>>> a = [1,2,3,4,5]
>>> ' '.join(map(str, a))
"1 2 3 4 5"

Numpy为此提供了两个函数,其中任何一个都应该适合您的需要。由于您可以使用这两种方法中的任何一种,下面是每种方法的示例:

>>> 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]])'

这两个函数都是高度优化的,因此应该优先于您自己编写的函数。在处理这种大小的数组时,我想你会想要尽可能快的速度。

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

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

同样,这是假设您的数组
a
在某个点上是一个numpy数组。这还具有处理矩阵的优点。

np.savetxt

Python 3():

Python 2:

import numpy as np
import sys

a = np.array([0.0, 1.0, 2.0, 3.0])
np.savetxt(sys.stdout, a)
import StringIO
sio = StringIO.StringIO()
np.savetxt(sio, a)
mystr = sio.getvalue()
print mystr
输出:

0.000000000000000000e+00
1.000000000000000000e+00
2.000000000000000000e+00
3.000000000000000000e+00
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 
0
1
2
3
或:

输出:

0.000
1.000
2.000
3.000 
0
1
2
3
获取字符串而不是打印

Python 3:

import io
bio = io.BytesIO()
np.savetxt(bio, a)
mystr = bio.getvalue().decode('latin1')
print(mystr, end='')
我们使用拉丁文1,因为它告诉我们这是使用的默认编码

Python 2:

import numpy as np
import sys

a = np.array([0.0, 1.0, 2.0, 3.0])
np.savetxt(sys.stdout, a)
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
0.000000000000000000e+00 1.000000000000000000e+00 2.000000000000000000e+00 3.000000000000000000e+00 
TODO:后面有一个空格。我看到的唯一解决方案是保存为字符串和条带


在Python2.7.15rc1和Python3.6.6上测试,numpy 1.13.3可能有点不太成熟,但我只是在使用了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
也有很多选项,因此您可以设置列宽,这对处理大量数据非常有用:

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

它将在数组元素上巧妙地拆分。请注意字符串开头的空格,以便在删除初始括号后对齐第一行。

如果要处理浮点数和二维数组,还可以执行以下操作:

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

与列表相同

:检查此项是否确实需要该大数组的字符串表示形式?为什么?之后我需要将这个数组和其他三个数组写入一个文件。所有数组都有不同的大小,我必须交替将它们写入文件中,因此我计划使用
writeline
手动执行。真正的问题是,为什么np.array2string没有抑制括号的选项。问得好。您是否只需要1D阵列(根据您的示例)、2D阵列(最常见)、3D或n-D阵列的答案…?谢谢,我以前尝试过
join
但没有成功<代码>映射
是我缺少的部分。一个更简单的变量(IMHO)应该是一个迭代器:
“”。join(str(n)表示a中的n)
类似的东西看起来不错:def float2str(f):返回“{.5f}”。format(f)”。join(Map(float2str,embedings\u fb.embedded\u token('))@tito有没有其他快速的替代方法来做同样的事情。对于一个大数组来说,它的速度非常慢。@shaifaliGupta打印比CPU更受I/O的限制,因此我怀疑其他方法是否会快得多。使用内置函数肯定有优势,但它仍然保留括号。因此,对于其他类似的情况,这种方法优于其他方法+1您说过需要将字符串保存到文件中。如果您计划以后从该文件中检索字符串,那么使用括号可能会很有用。此外,子字符串和splits()的组合将删除括号。当数组长度较长时,str()将不起作用。np.array2string是另一种选择。