相关疑难解决方法(0)

在NumPy中将元素方式和矩阵乘法与多维数组相结合

我有两个多维NumPy数组,A并且B,A.shape = (K, d, N)B.shape = (K, N, d).我想在轴0(K)上执行逐元素操作,该操作是在轴1和2(d, NN, d)上的矩阵乘法.所以结果应该是一个多维数组CC.shape = (K, d, d),这样C[k] = np.dot(A[k], B[k]).一个天真的实现看起来像这样:

C = np.vstack([np.dot(A[k], B[k])[np.newaxis, :, :] for k in xrange(K)])
Run Code Online (Sandbox Code Playgroud)

但这种实施很.稍微快一点的方法看起来像这样:

C = np.dot(A, B)[:, :, 0, :]
Run Code Online (Sandbox Code Playgroud)

它使用np.dot多维数组的默认行为,给我一个形状的数组(K, d, K, d).但是,此方法计算所需的答案K时间(沿轴2的每个条目都相同).渐渐地,它将比第一种方法慢,但开销要小得多.我也知道以下方法:

from numpy.core.umath_tests import matrix_multiply
C = matrix_multiply(A, B)
Run Code Online (Sandbox Code Playgroud)

但我不能保证这个功能可用.因此,我的问题是,NumPy是否提供了一种有效执行此操作的标准方法?一般来说,适用于多维数组的答案是完美的,但仅针对这种情况的答案也是很好的.

编辑:正如@Juh_所指出的,第二种方法是错误的.正确的版本是:

C …
Run Code Online (Sandbox Code Playgroud)

python numpy multidimensional-array

5
推荐指数
1
解决办法
1802
查看次数

SciPy:使用b向量数组的元素方式非负最小二乘

我需要解决线性问题Ax = b,x使用最小二乘法获得.所有元素x必须是非负的,所以我使用scipy.optimize.nnls(文档在这里).

麻烦的是,我需要用单个A矩阵和许多b向量多次解决这个问题.我有一个3d numpy ndarray,其中沿轴0b矢量是矢量,而其他两个轴对应于空间中的点.我希望将所有x向量输出到相应的数组,以便保留每个答案的空间信息.

问题的第一个传递看起来像这样:

A = np.random.rand(5,3)
b_array = B = np.random.rand(5,100,100)
x_array = np.zeros((3,100,100))

for i in range(100):
    for j in range(100):
        x_array[:,i,j] = sp.optimize.nnls(A, b_array[:,i,j])[0]
Run Code Online (Sandbox Code Playgroud)

这段代码非常实用,但感觉完全不优雅.更重要的是,它可能会非常慢(我的实际代码使用非常大的数据集,并且通过随机参数更改循环数千次,因此效率很重要).

不久之后,我问了一个关于元素矩阵乘法的非常相似的问题.我被介绍过np.einsum,在许多情况下证明它非常有用.我原本希望最小二乘解决方案有类似的功能,但一直找不到任何东西.如果有人知道可能有效的功能,或者有效/热情地解决这个问题的替代方法,那将非常感激!

python arrays numpy scipy least-squares

1
推荐指数
1
解决办法
2192
查看次数