我正在研究一些代码,以简化对具有不同数量特征的数据的SVM的训练,并使用" slice"来可视化这些SVM的决策边界。由用户指定。如果我的数据集和n
样本中有m
个功能,我会生成一个(n+1)-dimensional
网格网格,其中第一个索引的每个切片都是维度为m x m x ...
的网格n
}}。然后我可以使用我的SVM对我的meshgrid中的每个数据点进行分类。
我接下来要做的是在用户指定的任何两个维度中绘制这些结果的一部分。当数据只有两个功能时,我的代码会绘制我想要的内容,但是只要我添加第三个功能,我就会开始遇到索引问题。
假设我有一个三维矩阵predictions
,我想在与mesh
和index0=0
关联的网格网index1=1
中的所有值上绘制这些预测},以及这些方面的培训数据。我可以通过函数调用来执行此操作,如:
import matplotlib.pyplot as plt
plt.contourf(mesh[index0,:,:,0], mesh[index1,:,:,0], pred[:,:,0])
plt.scatter(samples[:,index0], samples[:,index1], c=labels)
plt.show()
我想知道的是如何动态构建索引数组,以便index0=0
和index1=1
得到上面的代码,但index0=1
和{{1}我们会得到:
index1=2
如果plt.contourf(mesh[index0,0,:,:], mesh[index1,0,:,:], pred[0,:,:])
和index0=0
,我们会得到:
index1=2
如何动态构建这些内容?对于我可能不知道数据将具有多少功能的情况,是否有更好的方法来解决这个问题?
我尝试过类似的事情:
plt.contourf(mesh[index0,:,0,:], mesh[index1,:,0,:], pred[:,0,:])
我也尝试过与mesh_indices0 = [0]*len(mesh.shape)
mesh_indices0[0] = index0
mesh_indices0[index0+1] = ':' # syntax error: I cannot add this dynamically
mesh_indices0[index1+1] = ':' # same problem
相反的方向,但这也是无效的语法。我想过尝试类似的东西:
mesh_indices = [:]*len(mesh.shape)
其中mesh_indices[index0+1] = np.r_[:len(samples[:, 1])]
是我的samples
观察结果。这对我来说似乎很笨重,所以我认为必须有一个更好的方法。
答案 0 :(得分:1)
我不确定我是否完全理解你要做的事情,但如果你想操纵切片,你应该使用python slice
对象:
mesh[index0,0,:,:]
相当于:
mesh[index0,0,slice(0,mesh.shape[2]),slice(0,mesh.shape[3])]
另请注意,您可以使用切片和索引的列表或元组进行索引:
inds = (index0, 0, slice(0,mesh.shape[2]), slice(0,mesh.shape[3]))
mesh[inds]
总而言之,您可以列出:
- 等效slice
个对象,然后用您的具体索引替换相应的对象。或者,走另一条路:
mesh_indices = [0]*len(mesh.shape)
mesh_indices[0] = index0
mesh_indices[index0+1] = slice(0, mesh.shape[index0+1])
mesh_indices[index1+1] = slice(0, mesh.shape[index1+1])