繁体   English   中英

使用索引在文本文件中保存numpy矩阵

[英]saving numpy matrix in text file with indices

我正在尝试将2D矩阵A保存到每个非零条目的文本文件中。 我想以下面的格式保存它,

对于第(i,j)个条目,一行为

row[i]::column[j]::A[i,j]

其中行和列是对应于行和列索引的1D numpy数组

我试过了,

np.savetxt(rel_file,(row,column,A),fmt='%d',delimiter="::",newline="\n");

但是,由于形状不匹配,我得到错误。 我不想迭代循环中的每个行和列索引(我认为它太耗时,我有5000 * 5000矩阵)。

在我的第一个答案中,我显示所有值; 只有非零,它更容易创建列数组。 np.where诀窍

In [1548]: I,J = np.nonzero(A)    # np.where 
In [1549]: Acol = np.column_stack((I,J,A[I,J]))

==========

对于所有值:

这是一个开始; 它是迭代的,但正如我评论的那样, np.savetxt也是np.savetxt

In [1523]: A=np.arange(25).reshape(5,5)

In [1526]: list(np.ndenumerate(A))
Out[1526]: 
[((0, 0), 0),
 ((0, 1), 1),
 ((0, 2), 2),
 ((0, 3), 3),
 ((0, 4), 4),
 ((1, 0), 5),

In [1528]: with open('txt','w') as f:
      ...:     for (i,j),v in np.ndenumerate(A):
      ...:         f.write('%d::%d::%d\n'%(i,j,v))
      ...:         
In [45]: cat txt
0::0::0
0::1::1
0::2::2
0::3::3
0::4::4
1::0::5

我们可以创建一个(n,3)数组,由A的索引和扁平值组成。 但是savetxt仍然可以有效地迭代它:

with open(...) as f:
   for row in Acol:
      f.write(fmt % tuple(row))

这是制作这个3列数组的一种方法:

In [1535]: I,J = np.meshgrid(np.arange(A.shape[0]),np.arange(A.shape[1]),indexin
      ...: g='ij')
In [1536]: I
Out[1536]: 
array([[0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2],
       [3, 3, 3, 3, 3],
       [4, 4, 4, 4, 4]])
In [1537]: Acol=np.column_stack((I.ravel(),J.ravel(),A.ravel()))
In [1538]: Acol
Out[1538]: 
array([[ 0,  0,  0],
       [ 0,  1,  1],
       [ 0,  2,  2],
       [ 0,  3,  3],
       [ 0,  4,  4],
       ....

下面是一个简单的方法,手动将原始数组重新整形为一个由row,col,value组成的非常长的数组。 只需过滤行非零,它应该工作。 以下示例适用于此随机50,50阵列。

a = np.random.randint(0,5, (50, 50))

rows = np.repeat(np.arange(50), 50)
cols = np.tile(np.arange(50), 50)

data = np.column_stack((rows, cols, a.flatten()))

data_filtered = data[data[:, 2] != 0]
np.savetxt('temp.txt',data_filtered,fmt='%d',delimiter="::",newline="\n");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM