只有整数、切片(`:`)、省略号(`...`)、numpy.newaxis(`None`)以及整数或布尔数组是有效的索引。

74
我正在实现FFT作为我的作业的一部分。我的问题在于使用位反转来洗牌数据元素的实现。我收到以下警告:
DeprecationWarning: 使用非整数而不是整数将在将来导致错误。
data[x],data[y] = data[y],data[x]
而自动评分系统(由大学提供)返回以下内容:
错误:只有整数、切片(:)、省略号(...)、numpy.newaxis(None)和整数或布尔数组是有效的索引。
我的代码是:
def shuffle_bit_reversed_order(data: np.ndarray) -> np.ndarray:
    """
    Shuffle elements of data using bit reversal of list index.

    Arguments:
    data: data to be transformed (shape=(n,), dtype='float64')

    Return:
    data: shuffled data array
    """

    # implement shuffling by reversing index bits

    size = data.size

    half = size/2;

    for x in range(size):
        xx = np.int(x)
        n = np.int(half)

        y = 0

        while n > 0:
            y += n * np.mod(xx,2)
            n /= 2
            xx = np.int(xx /2)

        if (y > x):

            data[x], data[y] = data[y], data[x]

    return data

我已经实现了fft函数,但在我解决这个洗牌函数之前它无法正常工作。我认为问题在于我的数据类型是'float64',而我可能错误地将其用作整数,但我不知道如何解决这个问题。

1
当您遇到该错误时,“y”的值是多少? - Barmar
3个回答

66

我认为你的问题在于:在你的 while 循环中,n 被除以 2,但在某个时刻没有再次转换为整数,因此它成为了一个浮点数。然后它被加到 y 上,这时 y 也变成了浮点数,从而导致了警告。


更广泛的视角:使用浮点数组进行索引会出现“IndexError:用作索引的数组必须是整数(或布尔)类型”,使用裸浮点或带有浮点数的列表进行索引会导致标题中的错误。 - Jann Poppinga

40
您可以使用双斜杠 // 替代单斜杠 /,这样可以直接转换为 int

6
运行得像魔法一样。 - Val Berthe
1
那就是解决问题的关键! - JayJay123

4
在所有的 voxelCoord 前面加上一个 int ...像下面这样:
patch = numpyImage [int(voxelCoord[0]),int(voxelCoord[1])- int(voxelWidth/2):int(voxelCoord[1])+int(voxelWidth/2),int(voxelCoord[2])-int(voxelWidth/2):int(voxelCoord[2])+int(voxelWidth/2)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接