将 Numpy 数组转换为 np.int_ 在多次重复后抛出 RuntimeWarning

Casting Numpy array to np.int_ throws RuntimeWarning after multiple repetitions

提问人:Oliver 提问时间:11/17/2023 最后编辑:Oliver 更新时间:11/17/2023 访问量:46

问:

我遇到了一个奇怪的行为,对此我没有很好的解释。 在一个函数中,我对复制的数组执行一些操作。当我运行此代码一次时没有问题。但是,当我在 for 循环中使用相同的输入调用函数时,出现以下错误:numpynumpy

RuntimeWarning: invalid value encountered in cast histogram 
= ((histogram / histogram.sum()) * INT_CASTER).astype(np.int64)

是 m x m 形状,作为 dtype。 是一个 n x m x m 张量,包含所有单独的直方图。每个总和> 0,因此除以 0 的误差会很奇怪。 这些直方图是从外部数据生成的每个函数调用。我不确定如何避免这种行为。我也尝试过避免这个错误。这仅部分有帮助,我现在可以连续调用该函数几次而不会出现错误,但是调用超过 5 次时,此错误再次出现。如果没有,错误已经在两次迭代后出现。histogramndarraynp.float64histogramshistogramdel histogramsdel

功能如下:

def _normalize_cast_int(histograms: NDArray[np.float64]) -> NDArray[np.int64]:
    int_histograms = np.empty(histograms.shape, dtype=np.int64)

    instances = histograms.shape[0]
    for i in range(instances):
        histogram = histograms[i].copy()
        histogram = ((histogram / histogram.sum()) * INT_CASTER).astype(np.int64)

        error = INT_CASTER - histogram.sum()
        mask = np.zeros(shape=histogram.size, dtype=np.int64)
        mask[:error] += 1
        np.random.seed(42)
        np.random.shuffle(mask)
        int_histograms[i] = histogram + np.reshape(mask, (-1, histogram.shape[0]))

    return int_histograms

蟒蛇 numpy numpy-ndarray

评论

0赞 Tim Roberts 11/17/2023
如果总和为 0,则最终会得到 NaNs,它不能转换为整数。
0赞 Oliver 11/17/2023
总和永远不会改变,因为我从相同的数据生成直方图 n 次。数据本身不会更改,因此总和不应为 0。
1赞 Warren Weckesser 11/17/2023
如果您提供最小的可重现示例,那么某人将更容易帮助您。
1赞 Tim Roberts 11/17/2023
而且您确定直方图中没有 ROW 总和为 0?
1赞 Warren Weckesser 11/17/2023
“单个行的总和可以为 0。”你有 ,所以会是一行 .然后,当一行总和为 0 时,将导致 0/0。histogram = histograms[i].copy()histogramhistogramshistogram / histogram.sum()histograms

答: 暂无答案