繁体   English   中英

动态构建一般的numpy数组索引

[英]Building a general numpy array index dynamically

基本背景

你好,专家。

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

我接下来要做的是在用户指定的任意两个维度上绘制这些结果的一部分。 当数据仅具有两个功能时,我有一些代码可以绘制所需的内容,但是一旦添加了第三个功能,我便开始遇到索引问题。

问题陈述

假设我有一个三维矩阵predictions ,我想在与index0=0index1=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=0index1=1 ,我们得到上面的代码,但是如果index0=1index1=2 ,我们将得到:

plt.contourf(mesh[index0,0,:,:], mesh[index1,0,:,:], pred[0,:,:])

如果index0=0index1=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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM