Python ValueError:包含多个元素的数组的真值不明确。使用cupy数组时,请使用.any()或.all()

Python ValueError:包含多个元素的数组的真值不明确。使用cupy数组时,请使用.any()或.all(),python,arrays,cupy,Python,Arrays,Cupy,我有一个密码,是从 下面的一个可以很好地处理numpy数组,但会抛出 ValueError:包含多个元素的数组的真值不明确。与cupy数组一起使用时,请使用.any()或.all()。 对于行ret_val[mask]=cp.repeat(arr.ravel(),rep.ravel() 我尝试使用cupy中已经存在的逻辑操作,但它们仍然会抛出错误 def repeat2dvect(arr,rep): 镜头=cp阵列(代表和(轴=-1)) maxlen=lens.max() ret_val=cp.

我有一个密码,是从

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

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

def repeat2dvect(arr,rep):
镜头=cp阵列(代表和(轴=-1))
maxlen=lens.max()
ret_val=cp.zeros((arr.shape[0],int(maxlen)))
遮罩=(镜头[:,无]>cp.arange(maxlen))
ret_val[mask]=cp.repeat(arr.ravel(),rep.ravel())
返回返回值

关于StackOverflow的第一个贡献的约定:)

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

将cupy作为cp导入
arr=cp.array([5,1,4],'float32')
rep=cp.array([3,2],'int32')
结果=cp.重复(arr,rep)
这个错误消息有点误导人:这段代码不起作用的原因是完全不同的

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

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


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

您能提供实际的样本输入吗?在我的试验中,代码在另一个地方失败了:
lens[:,None]
(因为
lens.shape
总是
()
),在NumPy和CuPy。对于arr
[[1234][1234][1234][1234][1234][1234][1234][/code>,对于rep code>来说,它也很相似
related?:将
rep
转换为
np.ndarray
对我的情况没有帮助,因为rep来自另一个函数,该函数使用cupy操作来获得加速比。因此,对
rep
使用numpy将无法达到获得GPU加速的目的。还尝试使用
cp.asnumpy
将cupy数组转换为numpy数组。虽然,它会导致另一个错误
ValueError:object\uuuuu array\uuuuu方法不生成数组
,但如果没有同步,原则上是不可能做到的。数组的形状存储为Python对象(这意味着在CPU内存上)。如果确定形状的信息(
rep
)在GPU上,则不可避免地首先同步GPU并将数据传输到CPU。是的,我想。我通过使用
rep.get()
arr.get()
并使用numpy.rep对这段小代码进行重复,使其正常工作。你能解释一下
.get()
到底做什么吗?我在cupy文档中找不到任何关于这方面的文档。正如我所看到的,它返回np.ndarray,但它与
cp.asnumpy()
有何区别?文档中说
cp.asnumpy()
可以将任何对象转换为
np.ndarray
。例如,
np.asnumpy(numpy\u数组)
相当于
numpy\u数组
,如果它已经是
np.ndarray
。另一方面,
cp.ndarray.get()
总是需要
cp.ndarray
来调用它。
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()