动态构建一个通用的numpy数组索引

时间:2014-06-03 19:34:50

标签: python arrays numpy scikit-learn

基本背景

你好,专家。

我正在研究一些代码,以简化对具有不同数量特征的数据的SVM的训练,并使用" slice"来可视化这些SVM的决策边界。由用户指定。如果我的数据集和n样本中有m个功能,我会生成一个(n+1)-dimensional网格网格,其中第一个索引的每个切片都是维度为m x m x ...的网格n }}。然后我可以使用我的SVM对我的meshgrid中的每个数据点进行分类。

我接下来要做的是在用户指定的任何两个维度中绘制这些结果的一部分。当数据只有两个功能时,我的代码会绘制我想要的内容,但是只要我添加第三个功能,我就会开始遇到索引问题。

问题陈述

假设我有一个三维矩阵predictions,我想在与meshindex0=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=0index1=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观察结果。这对我来说似乎很笨重,所以我认为必须有一个更好的方法。

1 个答案:

答案 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])