将numpy数组格式化为对齐的文本列

时间:2015-10-03 06:41:31

标签: python numpy python-3.4

我想设置在文本文件中写入的numpy数组的每个元素的字符长度

我目前得到的输出是:

99941     1 56765 56767 51785 51793     0     0     0     0

101150      1  59006  59005  51782  51783      0      0      0      0

正如您在上面的情况中看到的那样,随着数字的增加,列被移位。

但在理想情况下,输出应如下所示:

 99941      1  56765  56767  51785  51793      0      0      0      0

101150      1  59006  59005  51782  51783      0      0      0      0

有什么方法可以修复numpy数组的每个元素的字符长度,以便在考虑元素字符长度并保持列格式固定后从右到左写入元素?

这是我正在使用的代码片段。

def calculate(self, ElementNum1, ElementNum2):
    Angle = Function().Transformation(ElementNum1, ElementNum2)
    ElementInfo = Shell().getElement(ElementNum2)
    Card1 = np.array([0,0,0,0,0,0,0,0,0,0])
    Card1.itemset(0,(ElementInfo[0]))
    Card1.itemset(1,(ElementInfo[1]))
    Card1.itemset(2,(ElementInfo[2]))
    Card1.itemset(3,(ElementInfo[3]))
    Card1.itemset(4,(ElementInfo[4]))
    Card1.itemset(5,(ElementInfo[5]))
    return str(Card1)

def AngleSolution1(self,ElementPair):
    Pair = np.genfromtxt(ElementPair, dtype=int, comments='None', delimiter=', ')
    row = int(Pair.size/2)
    p = mp.Pool(processes=4)
    result = [p.apply_async(AngleCalculateFunction().calculate, args=(Pair[i][0], Pair[i][1])) for i in range(0, int(row/4))]
    Result = open('Angles.csv', "a")
    Result.write('\n'.join(map(str, ((((p.get()).replace('[','')).replace(']','')) for p in result))))
    Result.write('\n')
    Result.close()
    p.close()

由于我正在使用多处理错误,因此存在某些性能问题,但它超出了本讨论的范围。

2 个答案:

答案 0 :(得分:1)

您可以这样做:

99941      1          56765      56767      51785      51793      0          0          0          0         
101150     1          59006      59005      51782      51783      0          0          0          0         

那应该给你这样的输出:

%-10s

/* * listdir.c - Leer archivo de un directorio */ #include <stdio.h> #include <stdlib.h> #include <dirent.h> void err_quit(char *msg); int main(int argc, char *argv[]) { DIR *dir; struct dirent *mydirent; int i = 1; if(argc != 2) { //puts("USO: listdir {pathname}"); //exit(EXIT_FAILURE); argv[1]="/home/maudev"; } if((dir = opendir(argv[1])) == NULL) { err_quit("opendir"); } printf("%s%c%c\n","Content-Type:text/html;charset=iso-8859-1",13,10); printf("<TITLE>CARPETAS</TITLE>\n"); printf("<H3>CARPETAS</H3>\n"); printf("<select>\n"); while((mydirent = readdir(dir)) != NULL) { printf("\n<option value='%s'>%s",mydirent->d_name,mydirent->d_name); printf("</option>\n"); } printf("</select>\n"); closedir(dir); exit(EXIT_SUCCESS); } void err_quit(char *msg) { perror(msg); exit(EXIT_FAILURE); } 部分指定该列的宽度应为10个字符,并用空格填充剩余的字符。一点警告:这会在每一行的末尾打印出许多额外的空格。

答案 1 :(得分:1)

np.savetxt一次格式化一行,并将其写入打开的文件。

In [536]: x
Out[536]: 
array([[ 99941,      1,  56765,  56767,  51785,  51793,      0,      0,
             0,      0],
       [101150,      1,  59006,  59005,  51782,  51783,      0,      0,
             0,      0]])

实际上,它正在进行(使用print而不是用于说明目的的文件写入):

In [537]: fmt=' '.join(['%8d']*x.shape[1])
In [538]: for row in x:
    print(fmt%tuple(row))
   .....:     
   99941        1    56765    56767    51785    51793        0        0        0        0
  101150        1    59006    59005    51782    51783        0        0        0        0

或者,如果您想收集一个字符串中的所有行,您可以将它们附加到列表中:

In [544]: astr = []
In [545]: for row in x:
    astr.append(fmt%tuple(row))
   .....:     
In [546]: print('\n'.join(astr))
   99941        1    56765    56767    51785    51793        0        0        0        0
  101150        1    59006    59005    51782    51783        0        0        0        0

Python对象显示(str(...))通常会执行此类行追加和连接。