np.savetxt文件触发ValueError。为什么?

2024-06-10 18:47:27 发布

您现在位置:Python中文网/ 问答频道 /正文

在程序的前面,我计算了矩阵p和K。我需要PKP的特征值。因为这需要一段时间(这是一个10000 x 10000的矩阵),所以我想把结果保存到某个地方,这样即使我重新启动计算机也可以很容易地访问它。你知道吗

我的程序的最后两行是:

eigs=np.linalg.eig(P@K@P)
np.savetxt('eigdata.txt',eigs)

这会触发错误:

ValueError: could not broadcast input array from shape (10000,10000) into shape (10000)

删除最后一次会删除错误,因此问题肯定出在np.savetxt。你知道吗

我该怎么解决这个问题?你知道吗

谢谢


Tags: 程序txt地方计算机错误np矩阵shape
2条回答

使用eig中的一个简单示例:

In [332]: a = np.array([[1, 1j], [-1j, 1]]) 
     ...: w,v = np.linalg.eig(a)                                                                             

In [334]: np.savez('eig.npz', w=w, v=v)                                                                      


In [335]: d = np.load('eig.npz')                                                                             
In [336]: list(d.keys())                                                                                     
Out[336]: ['w', 'v']
In [337]: d['w']                                                                                             
Out[337]: array([2.+0.j, 0.+0.j])
In [338]: d['v']                                                                                             
Out[338]: 
array([[ 0.        +0.70710678j,  0.70710678+0.j        ],
       [ 0.70710678+0.j        , -0.        +0.70710678j]])

或者没有关键字名称:

In [339]: np.savez('eig.npz', w,v)                                                                           
In [340]: d = np.load('eig.npz')                                                                             
In [341]: list(d.keys())                                                                                     
Out[341]: ['arr_0', 'arr_1']
In [342]: d['arr_0']                                                                                         
Out[342]: array([2.+0.j, 0.+0.j])

我怀疑,如果出现pickle错误,是因为要保存元组或字典之类的对象:

In [345]: np.savez('eig.npz', {'w':w, 'v':v})                                                                
In [346]: d = np.load('eig.npz')                                                                             
In [347]: list(d.keys())                                                                                     
Out[347]: ['arr_0']
In [348]: d['arr_0']                                                                                         
...
ValueError: Object arrays cannot be loaded when allow_pickle=False

最近的numpy版本对这个pickling参数很挑剔。你知道吗

或者可以将数组保存到两个文件中:

In [370]: np.save('eig_w.npy',w); np.save('eig_v.npy',v)                                                     
In [371]: np.load('eig_w.npy')                                                                               
Out[371]: array([2.+0.j, 0.+0.j])
In [372]: np.load('eig_v.npy')                                                                               
Out[372]: 
array([[ 0.        +0.70710678j,  0.70710678+0.j        ],
       [ 0.70710678+0.j        , -0.        +0.70710678j]])

===

使用:

In [373]: eigs = np.linalg.eig(a)
In [375]: np.savez('eig.npz', eigs) 
ValueError: could not broadcast input array from shape (2,2) into shape (2)

这个错误是由np.array(eigs)步骤产生的。np.save用于保存数组。给定一个元组,它试图将其转换为数组。你知道吗

保存*eigs类似于上面的In [339]示例:

In [385]: np.savez('eig.npz', *eigs)                                                                         
In [386]: d = np.load('eig.npz')                                                          
In [387]: list(d.keys())                                                                                     
Out[387]: ['arr_0', 'arr_1']
In [388]: d['arr_1']                                                                                         
Out[388]: 
array([[ 0.        +0.70710678j,  0.70710678+0.j        ],
       [ 0.70710678+0.j        , -0.        +0.70710678j]])
In [389]: d['arr_0']                                                                                         
Out[389]: array([2.+0.j, 0.+0.j])

np.linalg.eig输出两个np.ndarray其中一个是shape(1000,1000),第二个是shape(1000,1000)。 您应该将它们保存到不同的文件中,或者使用np.saveznp.savez_compressedistead:

np.savez('eigdata', *eigs)

以后再恢复:

w, v = np.load('eigdata.npz').values()

相关问题 更多 >