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
开始。
我有一个代码,是从
下面的一个可以很好地处理 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
开始。