有没有人看到任何可能的切片方法? (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.]])
我一直在尝试加速 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.]])