[英]Building a general numpy array index dynamically
你好,专家。
我正在研究一些代码,以简化对具有不同数量特征的数据的SVM的训练,并使用用户指定的“切片”来可视化这些SVM的决策边界。 如果我的数据集中有n
特征并且有m
样本,则生成一个(n+1)-dimensional
格,其中沿第一个索引的每个切片都是n
维的mxmx ...
网格。 然后,我可以使用SVM对我的网格中的每个数据点进行分类。
我接下来要做的是在用户指定的任意两个维度上绘制这些结果的一部分。 当数据仅具有两个功能时,我有一些代码可以绘制所需的内容,但是一旦添加了第三个功能,我便开始遇到索引问题。
假设我有一个三维矩阵predictions
,我想在与index0=0
和index1=1
关联的mesh
中的所有值以及这些维度上的训练数据上绘制这些预测。 我可以使用以下函数调用来做到这一点:
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
和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 = [:]*len(mesh.shape)
,但这也是无效的语法。 我考虑过尝试以下方法:
mesh_indices[index0+1] = np.r_[:len(samples[:, 1])]
samples
是我的mxn
观测值集。 不过,这对我来说似乎真的很笨拙,因此我认为必须有更好的方法。
我不确定我是否完全了解您要执行的操作,但是如果您想操作切片,则应使用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
对象,然后用您的具体索引替换相应的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])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.