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是另一种选择。