关于python:Numpy Array2string只是在字符串中写…

Numpy Array2string just writing … in string?

本问题已经有最佳答案,请猛点这里访问。

我有一件简单的事情要做,读一些向量,然后把它们写在一个文件中。

矢量是1024维的。

1
2
3
4
 for emb in src:
            print(len(emb[0].detach().cpu().numpy()))  #--> prints 1024!
            f.write(np.array2string(emb[0].detach().cpu().numpy(), separator=', ') +"
"
)

我的文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
[-0.18077464, -0.02889516,  0.33970496, ..., -0.28685367,  0.00343359,
 -0.00380083]
[-0.04554039,  0.0891239 ,  0.0457519 , ..., -0.02622034,  0.04410202,
 -0.03626832]
[ 0.2415923 ,  0.36748591, -0.10974079, ...,  0.06169772,  0.0134424 ,
  0.01647076]
[ 0.019123  ,  0.00409475,  0.03623311, ..., -0.13063622,  0.02434589,
  0.00400023]
[ 0.01281842,  0.00028924,  0.03185712, ..., -0.062907  ,  0.02143336,
 -0.00206215]
[ 0.01748654,  0.00136842, -0.01337154, ..., -0.04148545,  0.00875527,
 -0.03006736]

所以,我不能访问我的向量,1024维被转换成任何6维或7维的向量。:(

如何正确地将向量写入文件?

干杯:


将二维数组写入文本文件(以便可以读取)的正常方法是使用np.savetxt

1
2
3
4
5
6
7
8
9
In [309]: src = np.random.rand(6,4)
In [310]: src
Out[310]:
array([[0.78756364, 0.11385762, 0.16631052, 0.10987765],
       [0.59954504, 0.80417064, 0.22461205, 0.47827772],
       [0.10993457, 0.11650874, 0.55887911, 0.71854456],
       [0.53572426, 0.55055622, 0.25423811, 0.46038837],
       [0.05418115, 0.50696182, 0.31515915, 0.65310375],
       [0.81168653, 0.81063907, 0.95371101, 0.11875685]])

写:

1
2
3
4
5
6
7
8
In [311]: np.savetxt('test.txt', src, fmt='%10.6f',delimiter=',')
In [312]: cat test.txt
  0.787564,  0.113858,  0.166311,  0.109878
  0.599545,  0.804171,  0.224612,  0.478278
  0.109935,  0.116509,  0.558879,  0.718545
  0.535724,  0.550556,  0.254238,  0.460388
  0.054181,  0.506962,  0.315159,  0.653104
  0.811687,  0.810639,  0.953711,  0.118757

测试负载:

1
2
3
4
5
6
7
8
In [314]: np.genfromtxt('test.txt',delimiter=',')
Out[314]:
array([[0.787564, 0.113858, 0.166311, 0.109878],
       [0.599545, 0.804171, 0.224612, 0.478278],
       [0.109935, 0.116509, 0.558879, 0.718545],
       [0.535724, 0.550556, 0.254238, 0.460388],
       [0.054181, 0.506962, 0.315159, 0.653104],
       [0.811687, 0.810639, 0.953711, 0.118757]])

savetxt进行格式化的逐行写入,大致如下:

1
2
3
4
5
6
7
8
9
10
11
12
In [315]: fmt = ','.join(['%10.6f']*4)
In [316]: fmt
Out[316]: '%10.6f,%10.6f,%10.6f,%10.6f'
In [317]: for row in src:
     ...:     print(fmt%tuple(row))    # f.write(...)
     ...:    
  0.787564,  0.113858,  0.166311,  0.109878
  0.599545,  0.804171,  0.224612,  0.478278
  0.109935,  0.116509,  0.558879,  0.718545
  0.535724,  0.550556,  0.254238,  0.460388
  0.054181,  0.506962,  0.315159,  0.653104
  0.811687,  0.810639,  0.953711,  0.118757

事实上,我可以将其打包成文件写入:

1
2
3
4
5
6
7
8
In [318]: with open('test1.txt','w') as f:
     ...:     for row in src:
     ...:         print(fmt%tuple(row), file=f)
     ...:    
In [319]: cat test1.txt
  0.787564,  0.113858,  0.166311,  0.109878
  0.599545,  0.804171,  0.224612,  0.478278
 ...

矢量仍然是1024维的,但显示屏只显示阵列的缩减视图。

您可以通过设置打印选项查看整个阵列:

1
2
import numpy as np
np.set_printoptions(threshold=np.nan)