python - 数组更改条目,尽管没有代码这样做......它是什么?

标签 python numpy

我三天前刚刚开始使用 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/

相关文章:

Python:在for循环中追加数组列

java - Python - 与子进程通信

python - 有没有一种方法可以在不重写整个代码的情况下将完整的Python(psychopy)程序实现到neurobs演示中?

带有 TextIOWrapper 的 python zipfile 模块

python - 在 zsh 终端的 Mac 上的 Python 中安装 xgboost 失败

python - 如何连接向量以在循环中创建数组?

python - 使用字符串检测变量(单词)中的变量(字母)

python - 查找边界之间错误颜色的像素

numpy - n 维 numpy.gradient 的逆

python - skcuda.fft 与 numpy.fft.rfft 不一样?