有没有人看到任何可能的切片方法? (python)

Does anyone see any possible way to slice this? (python)

我一直在尝试加速 Python 中的一些 numpy 数组,我知道 for 循环真的很糟糕,所以你应该对它们进行切片,但无论如何我都看不到切片。也许有一些聪明的把戏?我在这方面很缺乏经验,所以非常感谢任何帮助!

    def propind(in1, in2):
        return in1+M*in2
     
    for ind1 in range(M):
        for ind2 in range(N):
            for ind3 in range(M):
                for ind4 in range(N):
                    ret[propind(ind1,ind2), propind(ind3,ind4)] = tempH0s[ind1,ind2,ind4]*(ind1==ind3)

tempH0s 是一个 MxNxN 矩阵,ret 是一个 (MxN)x(MxN) 矩阵。

只是想给出我使用这个问题的评论得到的解决方案。它快了大约 20 倍,谢谢!

tempH0s2 = []

for z in range(M):
    tempL = np.zeros([M,N,N])
    tempL[z] = 1
    tempH0s2.append(tempH0s*tempL)

tempH0s3 = np.stack(tempH0s2, axis=2)

ret = np.reshape(tempH0s3, (M*N, M*N), order='F')

我正在尝试类似

ret = np.zeros((M,N,M,N))
ind = np.arange(M)
ret[ind,:,ind,:] = tempH0s[ind,:,:]
ret = ret.reshape(M*N, M*N)

但是值的布局与您的迭代不同。我怀疑 in1+M*in2 映射是差异的一部分。

如果可以计算出差异,这应该会快很多。

In [93]: tempH0s                                                                                     
Out[93]: 
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]]])

你的迭代产生

In [87]: foo(tempH0s,2,3)                                                                            
Out[87]: 
array([[ 0,  1,  0,  0,  0,  0],
       [ 3,  4,  0,  0,  0,  0],
       [ 0,  0,  9, 10, 11,  0],
       [ 0,  0, 12, 13, 14,  0],
       [ 0,  0, 15, 16, 17,  0],
       [ 0,  0,  0,  0,  0,  0]])

我的建议产生的地方:

array([[ 0,  1,  2,  0,  0,  0],
       [ 3,  4,  5,  0,  0,  0],
       [ 6,  7,  8,  0,  0,  0],
       [ 0,  0,  0,  9, 10, 11],
       [ 0,  0,  0, 12, 13, 14],
       [ 0,  0,  0, 15, 16, 17]])

您的其他代码生成

array([[ 0.,  0.,  1.,  0.,  2.,  0.],
       [ 0.,  9.,  0., 10.,  0., 11.],
       [ 3.,  0.,  4.,  0.,  5.,  0.],
       [ 0., 12.,  0., 13.,  0., 14.],
       [ 6.,  0.,  7.,  0.,  8.,  0.],
       [ 0., 15.,  0., 16.,  0., 17.]])