小编cp3*_*028的帖子

具有一侧填充的两个三维阵列的卷积太慢

在我目前的项目中,我需要以一种略微不同寻常的方式" 卷积 "两个三维数组:

假设我们有两个三维数组A和B,其尺寸为dimA和dimB(每个轴都相同).现在我们要为每个轴创建一个尺寸为dimA + dimB的第三个数组C.

C的条目计算如下:

c_{x1+x2,y1+y2,z1+z2} += a_{x1,y1,z1} * b_{x2,y2,z2}
Run Code Online (Sandbox Code Playgroud)

我目前的版本很简单:

dimA = A.shape[0]
dimB = B.shape[0]
dimC = dimA+dimB

C = np.zeros((dimC,dimC,dimC))
for x1 in range(dimA):
    for x2 in range(dimB):
        for y1 in range(dimA):
            for y2 in range(dimB):
                for z1 in range(dimA):
                    for z2 in range(dimB):
                        x = x1+x2
                        y = y1+y2
                        z = z1+z2
                        C[x,y,z] += A[x1,y1,z1] * B[x2,y2,z2] 
Run Code Online (Sandbox Code Playgroud)

不幸的是,这个版本非常慢,无法使用.

我的第二个版本是:

C = scipy.signal.fftconvolve(A,B,mode="full")
Run Code Online (Sandbox Code Playgroud)

但这只计算元素 max(dimA,dimB)

谁有更好的主意?

python numpy

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

Numpy Array Broadcasting具有不同的尺寸

我对numpy的广播规则感到有些困惑.假设您想要执行更高维数组的轴方向标量积,以将数组维度减少一(基本上沿一个轴执行加权求和):

from numpy import *

A = ones((3,3,2))
v = array([1,2])

B = zeros((3,3))

# V01: this works
B[0,0] = v.dot(A[0,0])

# V02: this works
B[:,:] = v[0]*A[:,:,0] + v[1]*A[:,:,1] 

# V03: this doesn't
B[:,:] = v.dot(A[:,:]) 
Run Code Online (Sandbox Code Playgroud)

为什么V03不起作用?

干杯

python numpy

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

Tensordot用于numpy数组和scipy稀疏矩阵

对于当前项目,我必须使用相同的矩阵(非常稀疏)计算许多向量的内积.向量与二维网格相关联,因此我将向量存储在三维数组中:

例如:

X是一个暗淡的阵列(I,J,N).矩阵A很暗淡(N,N).现在的任务是计算A.dot(X[i,j])每个i,jin I,J.

对于numpy数组,这很容易实现

Y = X.dot(A.T) 
Run Code Online (Sandbox Code Playgroud)

现在我想存储A为稀疏矩阵,因为它是稀疏的并且只包含非常有限数量的非零条目,这导致大量不必要的乘法.遗憾的是,由于numpy点不适用于稀疏矩阵,因此上述解决方案无效.据我所知,scipy稀疏没有类似数字的操作.

有没有人知道Y用稀疏矩阵计算上述数组的一种好而有效的方法A

numpy matrix scipy sparse-matrix

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

标签 统计

numpy ×3

python ×2

matrix ×1

scipy ×1

sparse-matrix ×1