0

我有一个代码,我从Numpy repeat 获得的二维数组

下面的一个适用于 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
4

1 回答 1

1

祝贺对 StackOverflow 的第一次贡献:)

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

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.ndarraycp.repeat().

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

在您的特定情况下,您可以例如手动转换repnp.ndarray(by ret.get()) 或从头开始rep计算。np.ndarray

于 2019-05-28T16:29:09.810 回答