newX
和breaks
分别是形状(24000L,)和(7L)的numpy ndarray。 newX在(0,9)范围内。 yvals
是一个基于分段为10,000(nsegs)样本的中断的查找表,称为xvals
(此处未使用)。
deltaX=(breaks[-1]-breaks[0])/nsegs
xvals=[x+i*deltaX for i in range(nsegs+1)]
休息和y are都是单调递增的。基本上,我希望当newX值小于break [0]时返回yvals [0],当newX值高于break [-1]时返回yvals [-1]。对于其他值,我希望它为与最接近xval的点对应的yvals生成索引(示例如下所示) 当我执行以下操作时:
condlist=[newX<=breaks[0] , newX < breaks[-1] , newX >= breaks[-1]]
choicelist=[yvals[0] , yvals[((newX-breaks[0]))/deltax.astype(int).item()] , yvals[-1]]
ans = np.select(condlist,choicelist)
我在选择列表行中收到错误 -
ValueError:只能将大小为1的数组转换为Python标量
我该如何解决这个问题?
答案 0 :(得分:1)
这里不需要numpy.select,你的目标可以简单说明
choicelist = yVals[ix]
其中ix是要计算的索引数组。我看到的是newX被线性转换,舍入为整数,被剪切,因此索引不会超出范围0 ... len(yVals)-1。所有这些都由
表达ix = np.clip(np.around((newX-breaks[0])/deltax).astype(int), 0, len(yVals)-1)
其中
np.around((newX-breaks[0])/deltax)
将计算结果舍入为最接近的整数。没有舍入.astype(int)会将它放在底层,这是不太理想的。np.clip(..., 0, len(yVals)-1)
剪辑结果,以便所有索引都有效。