在以下代码中,我从 beta分布中抽取一维double-valued
矩阵(mu
),然后使用此mu
矩阵使用伯努利分布对2-d二进制值矩阵(Z
)进行采样。但有时我最终会得到一些仅由zero
值填充的列。如何有效地编写一个函数来丢弃被零占用的列,并丢弃矩阵mu
中的相应值,而不会在函数 func
中导致任何冲突,其中<首先定义了strong> gsl matrices Z
,mu
?
由于我需要经常调用删除代码中零值列的函数,我想知道定义动态gsl矩阵的类型和分配特定大小但是能够{{1}的最佳方法是什么矩阵一遍又一遍没有发生任何错误? 到目前为止,这是我的代码:
resize
谢谢!
答案 0 :(得分:0)
这个答案并不是你所追求的,因为它只是Numpy。但是,我真的认为使用GSL会使代码变得更加复杂而无法获得实际收益。
你声称使用GSL是因为你相信它会得到&#34; C速度&#34; Numpy没有 - 这根本不是真的。 Numpy最终是用C语言编写的,所以如果你可以一次对整个数组执行操作,那么速度非常快。对Numpy数组的迭代速度较慢,但Cython +类型的内存视图允许您以&#34; C速度&#34;来执行此操作。
使用GSL的充分理由是:1)与使用GSL的现有C库进行交互或2)如果GSL提供了一个无法从Numpy获得的有用功能(在这种情况下,您可以使用该功能) + numpy的)。我不认为其中任何一个适用于此。
您可以轻松地将初始化函数减少为一个简短的纯Python + Numpy,它将在Numpy中的优化C循环中执行:
def initPar(alpha, N, K):
mu = np.cumprod(np.random.beta(alpha,1,size=(K,)))
# Bernoulli distribution is a special case of the binomial distribution
# use array broadcasting to get the shape of Z
Z = np.random.binomial(np.ones((N,1),dtype=np.int32),
mu[np.newaxis,:])
return mu, Z
删除所有全部为零的列(以及mu
的相应元素)的问题再次是直截了当的,并且很快就会出现问题:
mask = np.any(Z,axis=0) # true where any element of the set - i.e. the columns to keep
Z = Z[:,mask]
mu = mu[mask]