【发布时间】:2016-03-24 19:36:34
【问题描述】:
我是 Python 新手,正在尝试转换 2d numpy 数组,例如:
a=numpy.array([[191.25,0,0,1],[191.251,0,0,1],[191.252,0,0,1]])
到一个字符串,其中列条目由一个分隔符'\t'分隔,行由另一个分隔符'\n'分隔,并控制每列的精度,以获得:
b='191.250\t0.00\t0\t1\n191.251\t0.00\t0\t1\n191.252\t0.00\t0\t1\n'
首先,我通过以下方式创建数组:
import numpy as np
col1=np.arange(191.25,196.275,.001)[:, np.newaxis]
nrows=col1.shape[0]
col2=np.zeros((nrows,1),dtype=np.int)
col3=np.zeros((nrows,1),dtype=np.int)
col4=np.ones((nrows,1),dtype=np.int)
a=np.hstack((col1,col2,col3,col4))
然后我通过以下两种方法之一生成 b:
方法一:
b=''
for i in range(0,a.shape[0]):
for j in range(0,a.shape[1]-1):
b+=str(a[i,j])+'\t'
b+=str(a[i,-1])+'\n'
b
方法二:
b=''
for i in range(0,a.shape[0]):
b+='\t'.join(['%0.3f' %x for x in a[i,:]])+'\n'
b
但是,我猜有更好的方法来生成 a 和 b。我正在寻找最有效的方法(即内存、时间、代码紧凑性)来创建 a 和 b。
跟进问题
谢谢你,迈克,
b = '\n'.join('\t'.join('%0.3f' %x for x in y) for y in a)+'\n'
为我工作,但我有一些后续问题(评论部分不适合):
- 虽然这更紧凑,但速度是否与执行嵌套 for 循环相同,因为这似乎是括号内发生的事情?
- 我知道 x 和 y 是跨 y 的 2 个维度的迭代器,但是,Python 如何“知道”它们是什么以及它们应该迭代哪些维度?例如,在 Matlab 中,这些事情必须明确说明。
- 有没有办法独立设置每列的精度(例如,我希望前三列使用 %0.3f,最后一列使用 %0.0f)?
- 是否有一种简单的方法来执行相反的过程 - 即给定 b,产生 a?我想出了两种方法:
方法一
y=b.split('\n')[:-1]
z=[y[i].split('\t') for i in range(0,len(y))]
a=numpy.array(z,dtype=float)
方法二
import re
a=numpy.array(filter(None,re.split('[\n\t]+',b)),dtype=float).reshape(-1,4)
有没有更好的办法?
【问题讨论】:
标签: python arrays string numpy delimiter