在python中用scatter3D绘制列表或数组的列

2024-10-01 15:36:47 发布

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

我想用不同的核函数在scikit-learn中尝试一些高斯过程回归的测试,并绘制结果。我还使用LeaveOneOut函数来训练GPR,然后在一个输入数据上进行测试。在

输入和目标数据是np.arrray,它们是从一个文件中读取的,并且两者都是(5x3):

inputData = np.array([[30.1678, -173.569, 725.724],
 [29.9895, -173.34,  725.76 ],
 [29.9411, -173.111, 725.768],
 [29.9306, -173.016, 725.98 ],
 [29.6754, -172.621, 725.795]])

targetData = np.array([[14.8016, -175.911, 779.752],
[14.7319, -175.483, 779.504],
[14.5022, -175.087, 779.388],
[14.4904, -174.576, 779.416],
[14.4881, -174.058, 779.452]])

使用LeaveOneOut我用(4x3)输入数据训练GPR,并对(1x3)输入数据进行迭代测试,每次都将其添加到list或{}中。在指定内核的for循环中完成LeaveOneOut之后,我想用scatter3D和{}绘制预测图。但是我得到以下错误:

^{pr2}$

如果我将每个预测追加到一个列表中,并在np.array中进行转换,那么我得到:

ax1.plot3D(inputDataTrainappendArr[:, 0], inputDataTrainAppendArr[:, 1], inputDataTrainAppendArr[:, 2], 'b:', label=u'InputDataLine')

op_flags=[op_flag], itershape=shape, order='C').itviews[0]
ValueError: input operand has more dimensions than allowed by the axis remapping

我的测试脚本看起来像:

loo = LeaveOneOut()
inputDataTrainAppend= []
inputDataTestAppend= []

kernels= [
      1.0 * RBF(length_scale=1.0, length_scale_bounds=(1e-1, 10.0)),
      1.0 * RBF(length_scale=100.0, length_scale_bounds=(1e-2, 1e3)) + WhiteKernel(noise_level=1, noise_level_bounds=(1e-10, 1e+1)),
      1.0 * ExpSineSquared(length_scale=1.0, periodicity=3.0, length_scale_bounds=(0.1, 10.0), periodicity_bounds=(1.0, 10.0)),
      1.0 * Matern(length_scale=1.0, length_scale_bounds=(1e-1, 10.0), nu=1.5)
        ]

for index, kernel in enumerate(kernels):

    for trainIdx, testIdx in loo.split(inputData):

        inputDataTrain= inputData[trainIdx]
        inputDataTest= inputData[testIdx]

        inputDataTrainAppend.append(inputDataTrain)
        inputDataTestAppend.append(inputDataTest)


    plt.figure(num= None, figsize= (50, 50), dpi= 100, facecolor= 'w', edgecolor= 'k')
    ax1 = plt.axes(projection='3d')

    #inputDataTrainAppendArr= np.array(inputDataTrainAppend)
    #inputDataTestAppendArr= np.array(inputDataTestAppend)

    ax1.scatter3D(inputDataTrainAppend[:, 0], inputDataTrainAppend[:, 1], inputDataTrainAppend[:, 2], s=15, c='b', label=u'InputData')
    ax1.plot3D(inputDataTrainAppend[:, 0], inputDataTrainAppend[:, 1], inputDataTrainAppend[:, 2], 'b:', label=u'InputDataLine')

    #ax1.scatter3D(inputDataTrainAppendArr[:, 0], inputDataTrainAppendArr[:, 1], inputDataTrainAppendArr[:, 2], s=15, c='b', label=u'InputData')
    #ax1.plot3D(inputDataTrainAppendArr[:, 0], inputDataTrainAppendArr[:, 1], inputDataTrainAppendArr[:, 2], 'b:', label=u'InputDataLine')

    ax1.set_xlabel('$x$')
    ax1.set_ylabel('$y$')
    ax1.set_zlabel('$z$')
    ax1.set_xlim(-200, 800)
    ax1.set_ylim(-200, 800)
    ax1.set_zlim(-200, 800)
    plt.legend(loc='upper left')
    plt.show()

如果我还想打印附加列表的每一列,我得到

print('inputDataTrainAppend[: 0]:', inputDataTrainAppend[:, 0], '\n')
print('inputDataTrainAppend[: 1]:', inputDataTrainAppend[:, 1], '\n')
print('inputDataTrainAppend[: 2]:', inputDataTrainAppend[:, 2], '\n') 



inputDataTestAppend[: 0]: [[  30.1678 -173.569   725.724 ]
[  29.9895 -173.34    725.76  ]
[  29.9411 -173.111   725.768 ]
[  29.9306 -173.016   725.98  ]
[  29.6754 -172.621   725.795 ]]

print('inputDataTrainAppend[: 1]:', inputDataTrainAppend[:, 1], '\n')
IndexError: index 1 is out of bounds for axis 1 with size 1

谢谢你的帮助


Tags: 数据fornparraylengthlabelscaleset
1条回答
网友
1楼 · 发布于 2024-10-01 15:36:47

我猜问题出在数组的切片上。如果我用numpy.ndarray.flatten把它调成一个调暗,它就会工作

ax1.scatter3D(inputDataTrainAppendArr[..., 0].flatten(), inputDataTrainAppendArr[..., 1].flatten(), inputDataTrainAppendArr[..., 2].flatten(), s=15, c='lime', label=u'PredictedData')
ax1.plot3D(inputDataTrainAppendArr[..., 0].flatten(), inputDataTrainAppendArr[..., 1].flatten(), inputDataTrainAppendArr[..., 2].flatten(), 'lime', label=u'PredictedDataLine')

相关问题 更多 >

    热门问题