我想把 a = [1,2,3,4,5]
转换成 a_string = "1 2 3 4 5"
。由于真实的 numpy 数组非常大 (50000x200),所以我认为使用 for 循环
太慢了。
我想把 a = [1,2,3,4,5]
转换成 a_string = "1 2 3 4 5"
。由于真实的 numpy 数组非常大 (50000x200),所以我认为使用 for 循环
太慢了。
join
方法:>>> a = [1,2,3,4,5]
>>> ' '.join(map(str, a))
"1 2 3 4 5"
join
但没有成功。Map
是我缺失的部分。 - Framester' '.join(str(n) for n in a)
。 - alexisnp.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。
也许有点小技巧,但是我只需在使用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
它会聪明地在数组元素处分割。请注意,在删除初始括号后,附加到字符串开头的空格用于对齐第一行。
如果您有一个起始的numpy数组而不是列表(因为您在帖子中提到了“真正的numpy数组”),您可以在数组的字符串表示上使用re.sub
:
print(re.sub('[\[\]]', '', np.array_str(a)))
假设你的数组a
在某个时刻是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]])'
这两个函数都经过高度优化,因此应优先考虑使用它们,而不是编写自己的函数。当处理这样大小的数组时,我想你会希望尽可能提高速度。
如果您正在处理浮点数和二维数组,您也可以执行以下操作:
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
>>> 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
与列表相同
writeline
手动完成。 - Framester