python - numpy 直方图 bool 索引与沿维度 0 的索引数组不匹配;维度是

标签 python arrays numpy

我正在尝试通过创建每个图像中像素强度的直方图来对天文图像进行天空减法,然后将天空值设置为等于最高频率箱的强度。然后,我们的想法是从该帧内的每个像素中减去该天空值。IndexError: bool 索引与沿维度 0 的索引数组不匹配;维度是 3651469 但对应的 bool 维度是 3651468

#sciFlat is a list containing three images in array form.

sciFlat = np.asarray(sciFlat)
minpix = min(sciFlat.flatten())
maxpix = max(sciFlat.flatten())
rng = int(maxpix-minpix)
#These are histogram ranges, now loop through each image.
#Sky subtract science images.
sciSky = []
for i in range(3):
    hf = np.histogram(sciFlat[i].flatten(), bins=rng, range=(minpix,maxpix))
    skyval = hf[1][hf[0] == max(hf[0])]
    print(skyval)
    skySub = sciFlat[i] - skyval
    sciSky.append(skySub)

我希望代码能够成功完成,因为 numpy.histogram 应该返回 hist (大小为 n 的扁平数组)和 bin_edges (长度为 n 的一维数组)。

IndexError Traceback(最近一次调用最后)

142     hf = np.histogram(sciFlat[i].flatten(), bins=rng, range=(minpix,maxpix))
143---> **skyval = hf[1][hf[0] == max(hf[0])]** <----
144     print(skyval)
145     skySub = sciFlat[i] - skyval

IndexError: bool 索引与维度 0 上的索引数组不匹配;维度是 3651469 但对应的 bool 维度是 3651468

最佳答案

我相信这只是您的逻辑在循环中失败,写出直方图输出:

for i in range(3):
    hist, edges = np.histogram(sciFlat[i].flatten(), bins=rng, range=(minpix,maxpix))
    skyval = edges[hist == max(hist)]
    print(skyval)
    skySub = sciFlat[i] - skyval
    sciSky.append(skySub)

直方图为您提供值的边缘,您最可能想要的是边缘的中点:

for i in range(3):
    hist, edges = np.histogram(sciFlat[i].flatten(), bins=rng, range=(minpix,maxpix))
    mids = edges[:-1] + np.diff(edges)/2
    skyval = mids[hist.argmax()]
    print(skyval)
    skySub = sciFlat[i] - skyval
    sciSky.append(skySub)

通过设置中间而不是边缘,您的直方图具有相同的尺寸。为了说明边缘和中间的区别:

sciFlat = np.random.uniform(0,15,100)
hist, edges = np.histogram(sciFlat, bins=(sciFlat.max()-sciFlat.min()).astype(int), range=(sciFlat.min(), sciFlat.max()))
mids = edges[:-1] + np.diff(edges)/2

hist.size
Out[33]: 14

edges.size
Out[34]: 15

mids.size
Out[35]: 14

plt.hist(sciFlat, bins=(sciFlat.max()-sciFlat.min()).astype(int), range=(sciFlat.min(), sciFlat.max()))
plt.plot(mids[hist.argmax()], hist.max(), marker='*', ms=20, c='C3', zorder=1)
plt.plot(mids, hist, 'o', zorder=2, c='C1')

星号表示最大的中点,如您所见,它位于边缘之间: enter image description here

关于python - numpy 直方图 bool 索引与沿维度 0 的索引数组不匹配;维度是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47607931/

相关文章:

python - 使用numpy计算列表上的标准差忽略零

python - 如何有效地填充时间序列?

python - 如何控制 tensorflow 中的维度广播?

python - numpy.sum 在 numpy.array 与 pandas.DataFrame 上的行为不同

python - 两列到一列的值差异

java - 如何编写一个方法来计算数组中所有项目的总成本?

java - 使用插入排序算法,使用对象数组中的多个字段

arrays - Perl:将元素插入数组用新的变量值替换现有值

numpy - 在 Alpine linux 中寻找用于安装 numpy 的包

python - 使用原始文件名的部分动态命名导入 Python 的 DataFrame