2016-12-27 49 views
1

我正在嘗試將2D矩陣A保存爲文本文件中的每個非零條目。我想給它的一個線保存在下面的格式,在索引文本文件中保存numpy矩陣

對於(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矩陣)。

+0

'savetxt'遍歷每個輸入2d數組的「行」,對該行進行格式化,並將其作爲一行寫入。 – hpaulj

回答

0

繼承人是手動重塑原始數組一個簡單的方法是一個很長的陣列由行,列,值組成。只需過濾非零的行,它應該工作。下面的例子適用於這個隨機的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"); 
0

在我的第一個答案中,我顯示了所有的值;僅使用非零值就可以更容易地創建列數組。 np.where的伎倆

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

==========

對於所有值:

這裏是一個開始;它是迭代的,但正如我所評論的那樣,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], 
     ....