Numpy CuPy和Dirichlet给了我TypeError:不支持的操作数类型(+;=):';int';和';元组';

Numpy CuPy和Dirichlet给了我TypeError:不支持的操作数类型(+;=):';int';和';元组';,numpy,cupy,numpy-random,Numpy,Cupy,Numpy Random,我只想创建一个随机矩阵a,它的向量是从Dirichlet分布中提取的。该函数可以在以下情况下正常工作: 当我对你做同样的事情时 我得到以下错误: --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-1-45a4f

我只想创建一个随机矩阵a,它的向量是从Dirichlet分布中提取的。该函数可以在以下情况下正常工作:

当我对你做同样的事情时

我得到以下错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-1-45a4f64a8b6e> in <module>
      6 n = 10000 #Size of the square matrix
      7 
----> 8 A = cp.random.dirichlet(cp.ones(n), n)
      9 
     10 print("--- %s seconds ---" % (time.time() - start_time))

~\anaconda3\envs\tensorflow\lib\site-packages\cupy\random\_distributions.py in dirichlet(alpha, size, dtype)
    112     """
    113     rs = _generator.get_random_state()
--> 114     return rs.dirichlet(alpha, size, dtype)
    115 
    116 

~\anaconda3\envs\tensorflow\lib\site-packages\cupy\random\_generator.py in dirichlet(self, alpha, size, dtype)
    144             size = alpha.shape
    145         else:
--> 146             size += alpha.shape
    147         y = cupy.empty(shape=size, dtype=dtype)
    148         _kernels.standard_gamma_kernel(alpha, self._rk_seed, y)

TypeError: unsupported operand type(s) for +=: 'int' and 'tuple'
然后我得到同样的错误

当我手动检查时,第146行的
alpha.shape
为(n,)。是丘比特虫还是我遗漏了什么


我正在为CUDA 10.1使用cupy-cuda101 8.5.0版。与cupy和tensorflow相关的所有其他功能都在我的GPU(2080ti)上完美运行。

这是cupy中的一个bug,您应该在他们的GitHub上报告

尽管有文档,但它们不能正确处理整型参数的情况。它们要求您提供元组或
None
。这就是为什么你会看到你所看到的行为。(如果您提供了一个元组
(a,b)
,则生成的形状将正确地为
(a,b,n)


这里的解决方法是以长度为1的元组形式提供所需的形状:
(n,)
。请注意逗号是必需的。

谢谢。我将在他们的GitHub上报告它。此解决方案有效。更新:我已提交了一个解决方案来更正此问题。很好,我希望它很快被合并。谢谢。感谢您的拉取请求!我们将在下一版本中包含它。
import cupy as cp
A = cp.random.dirichlet(cp.ones(n), n)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-1-45a4f64a8b6e> in <module>
      6 n = 10000 #Size of the square matrix
      7 
----> 8 A = cp.random.dirichlet(cp.ones(n), n)
      9 
     10 print("--- %s seconds ---" % (time.time() - start_time))

~\anaconda3\envs\tensorflow\lib\site-packages\cupy\random\_distributions.py in dirichlet(alpha, size, dtype)
    112     """
    113     rs = _generator.get_random_state()
--> 114     return rs.dirichlet(alpha, size, dtype)
    115 
    116 

~\anaconda3\envs\tensorflow\lib\site-packages\cupy\random\_generator.py in dirichlet(self, alpha, size, dtype)
    144             size = alpha.shape
    145         else:
--> 146             size += alpha.shape
    147         y = cupy.empty(shape=size, dtype=dtype)
    148         _kernels.standard_gamma_kernel(alpha, self._rk_seed, y)

TypeError: unsupported operand type(s) for +=: 'int' and 'tuple'
import cupy as cp
import numpy as np

A = cp.random.dirichlet(np.ones(n), n)