ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() when using cupy array

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() when using cupy array

我有一个代码,是从

那里得到的

下面的一个可以很好地处理 numpy 数组但是抛出 ValueError:具有多个元素的数组的真值不明确。与 cupy 数组一起使用时,请使用 a.any() 或 a.all()。 对于行 ret_val[mask] = cp.repeat(arr.ravel(), rep.ravel()

我已经尝试使用 cupy 中已经存在的逻辑操作,但它们仍然会抛出错误。

def repeat2dvect(arr, rep):
    lens = cp.array(rep.sum(axis=-1))
    maxlen = lens.max()
    ret_val = cp.zeros((arr.shape[0], int(maxlen)))
    mask = (lens[:,None]>cp.arange(maxlen))
    ret_val[mask] = cp.repeat(arr.ravel(), rep.ravel())
    return ret_val

祝贺您对 Whosebug 的第一个贡献:)

我用以下代码复制了错误:

import cupy as cp

arr = cp.array([5, 1, 4], 'float32')
rep = cp.array([3, 2], 'int32')
result = cp.repeat(arr, rep)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

此错误消息有点误导:此代码不起作用的原因完全不同。

简而言之,您不能将 cp.ndarray 作为 cp.repeat() 的第二个参数传递。

为什么?这是因为 result 的形状是根据该参数的值确定的。 如果它是 ndarray,它在 CuPy 中会有问题(但在 NumPy 中不会),因为数组的值在 GPU 中。为了确定输出形状,CuPy 必须等待 GPU 完成所有排队的计算,然后将值传输到 CPU。这只会破坏异步计算的好处。 CuPy 有意禁止这样的操作。

在您的特定情况下,例如,您可以手动将 rep 转换为 np.ndarray(通过 ret.get())或将 rep 计算为 np.ndarray开始。