我三天前刚刚开始使用 python,我已经遇到了一个问题。我在www 上找不到任何信息。它看起来像一个错误 - 但我想我做了某事。错误的。 但是我找不到问题所在。
我们开始吧: 我有 1 个名为“inputData”的列表。 所以我所做的就是取出每个数组中的前 10 个条目,用 polyfit 拟合它,将拟合参数保存在变量“linFit”中,然后从我的“inputData”中减去拟合并将其保存在一个名为“的新列表中”正确的数据”。打印行只是为了向您显示“错误”。
如果您运行下面的代码并比较该过程之前和之后的“inputData”打印,就会发现它是不同的。我不知道为什么... :( 但是,如果删除“inputData”中的两个数组之一,它就可以正常工作。 有人有什么想法吗? 谢谢!
import matplotlib.pyplot as plt
import pylab as np
inputData = [np.array([[ 1.06999998e+01, 1.71811953e-01],
[ 2.94000015e+01, 2.08369687e-01],
[ 3.48000002e+01, 3.70725733e-01],
[ 4.28000021e+01, 4.96874842e-01],
[ 5.16000004e+01, 5.20280702e-01],
[ 6.34000015e+01, 6.79658073e-01],
[ 7.72000008e+01, 7.15826614e-01],
[ 8.08000031e+01, 8.38463318e-01],
[ 9.27000008e+01, 9.07969677e-01],
[ 10.65000000e+01, 10.76921320e-01],
[ 11.65000000e+01, 11.76921320e-01]]),
np.array([[ 0.25999999e+00, 1.21419430e-01],
[ 1.84000009e-01, 2.26843166e-01],
[ 2.41999998e+01, 3.69826150e-01],
[ 3.90000000e+01, 4.12130547e-01],
[ 4.20999985e+01, 5.92435598e-01],
[ 5.22999992e+01, 6.44819438e-01],
[ 6.62999992e+01, 7.23920727e-01],
[ 7.65000000e+01, 8.45791912e-01],
[ 8.22000008e+01, 9.97368264e-01],
[ 9.55000000e+01, 10.48223877e-01]])]
linFit = [['', '']]*15
linFitData = [['', '']]*15
correctData = np.copy(inputData)
print(inputData)
for i, entry in enumerate(inputData):
CUT = np.split(entry, [10], axis=0)
linFitData[i] = CUT[0]
linFit[i] = np.polyfit(linFitData[i][:,0], linFitData[i][:,1], 1)
for j, subentry in enumerate(entry):
correctData[i][j][1] = subentry[1]-subentry[0]*(linFit[i][0]+linFit[i][1])
#print (inputData[0][0][1])
print('----------')
print(inputData)
for i, entry in enumerate(inputData):
plt.plot(entry[:,0], entry[:,1], '.')
plt.plot(linFitData[i][:,0], (linFitData[i][:,0])*(linFit[i][0])+(linFit[i][1]))
#plt.plot(correctData[i][:,0], correctData[i][:,1], '.')
最佳答案
你的inputData
不是一个numpy数组,它是一个数组列表。这两个列表的长度不同:
>>> [len(sl) for sl in inputData]
[11, 10]
numpy 数组无法处理不同的长度。如果您尝试用它创建一个数组,您将得到一个对象数据类型的一维数组,而不是 float 据类型的二维数组,其成员是列表:
>>> a = np.array(inputData)
>>> a.shape, a.dtype
((2,), dtype('O'))
所以你的“副本”实际上只是一个浅拷贝;里面的列表与 inputData
中的对象相同:
>>> correctData = np.copy(inputData)
>>> inputData[0] is correctData[0]
True
>>> inputData[1] is correctData[1]
True
<小时/>
顺便说一句,你不能像这样乘以列表 linFit = [['', '']]*15
;这也不会复制(请参阅 here )。 linFit[0] is linFit[1]
- 尝试更改子列表之一以查看这一点。
关于python - 数组更改条目,尽管没有代码这样做......它是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22073028/