【问题标题】:IndexError: Too many indices when indexing array with another arrayIndexError:使用另一个数组索引数组时索引过多
【发布时间】:2015-07-31 21:36:48
【问题描述】:

我知道很多人都问过这个错误,但我还没有找到任何可以帮助我的东西。

这是我的代码:

def nanalyze(pupil, pw_sim):
    import numpy as np

    temp_s = abs(pw_sim)**2 * pupil

    vals_x, vals_y = np.where(pupil > 0)
    mask = pupil[vals_x[0]:vals_x[len(vals_x)-1], vals_y[0]:vals_y[len(vals_y)-1]]

    s_i = (np.mean(temp_s[tuple(mask)]**2) / (np.mean(temp_s[tuple(mask)])**2)) - 1
    return s_i

倒数第二行s_i = (np.mean(temp_s[tuple(mask)]**2) / (np.mean(temp_s[tuple(mask)])**2)) - 1 是返回索引错误的原因:索引过多。

pupilpw_sim 都是形状为 (1024,1024) 的数组。因此temp_s 也是(1024,1024) 数组,mask 最终成为(1023,1023) 数组。我尝试将mask 设为(1024,1024) 来检查是否因为形状不同而出现索引错误,但这似乎并没有改变任何东西。

【问题讨论】:

  • 这应该做什么:temp_s[tuple(mask)]
  • 它应该使用mask 索引temp_s。我从 Matlab 代码中翻译了整个内容,它的名称为temp_s(mask)
  • 如果您正在创建 tuple - 它不能用作索引(据我所知)。
  • 嗯。我最初只是将它作为temp_s[mask] 使用,但我得到了一个不同的错误,说我不能使用掩码作为索引。我实际上在这个网站上找到了一个different question,它说可以通过使用tuple 来纠正

标签: python arrays indexing


【解决方案1】:

您可能应该阅读有关 numpy 的 advanced indexing,有时称为“花式索引”。

从你的问题中不清楚你想用temp_s[mask]做什么。如果 mask 真的是一个面具,你需要确保它具有 dtype bool 并且具有与 temp_s 相同的形状。如果不是面具,您需要更好地解释您要做什么。

【讨论】:

  • 谢谢,我会调查的。 mask 是我正在使用的模块的掩码,但它不是具有 dtype bool 的掩码。我对temp_s[mask] 的了解是它应该使用mask 来索引temp_s
【解决方案2】:

事实证明,简化和使用不同的语法解决了这个问题。现在,而不是

vals_x, vals_y = np.where(pupil > 0)
mask = pupil[vals_x[0]:vals_x[len(vals_x)-1], vals_y[0]:vals_y[len(vals_y)-1]]

s_i = (np.mean(temp_s[tuple(mask)]**2) / (np.mean(temp_s[tuple(mask)])**2)) - 1

我有

temp_s_nz = np.mean(temp_s[pupil >0])
temp_sq_nz = np.mean(temp_s[pupil >0]**2)

s_i = (temp_sq_nz) / (temp_s_nz)**2 - 1

这个改动是我的导师做的,所以我不能完全解释为什么它会起作用,但我知道不再有任何错误并且代码更易于阅读。我认为这是因为pupil >0 的定义方式。在我的原始代码中有出错的余地,现在没有了。感谢您的所有帮助。

【讨论】:

    猜你喜欢
    • 2020-09-26
    • 2013-12-08
    • 2018-05-23
    • 1970-01-01
    • 2019-07-17
    • 2020-09-14
    • 1970-01-01
    相关资源
    最近更新 更多