程序中较早的时候,我计算矩阵P和K。我需要 PKP 的特征值。由于这需要一段时间(这是10000 x 10000矩阵),因此我想将结果保存到某个地方,以便即使重新启动计算机也可以轻松访问。
程序的最后两行是:
eigs=np.linalg.eig(P@K@P)
np.savetxt('eigdata.txt',eigs)
这会触发错误:
ValueError:无法广播来自形状(10000,10000)的输入数组 成型(10000)
最后一次删除可以消除错误,因此问题肯定出在np.savetxt
上。
我该如何解决?
谢谢
答案 0 :(得分:1)
np.linalg.eig
输出两个np.ndarray
,其中一个形状为(1000,),第二个形状为(1000,1000)。
您应该将它们保存到其他文件中,或者使用np.savez
或np.savez_compressed
代替:
np.savez('eigdata', *eigs)
并在以后还原它们:
w, v = np.load('eigdata.npz').values()
答案 1 :(得分:0)
使用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])
我怀疑如果出现泡菜错误,那是因为要保存一个元组或字典之类的对象:
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版本对此腌制参数变得很挑剔。
或者您可以将数组保存为两个文件:
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])