【问题标题】:Creating a NumPy array out of another array with shifted indices从另一个具有移位索引的数组中创建一个 NumPy 数组
【发布时间】:2025-12-05 22:10:02
【问题描述】:

我想通过周期性移位从 2D 数组生成 4D 数组,可以通过以下方式总结:

uuvv[kx,ky,qx,qy] = uu[kx+qx,ky+qy]

这最容易用“2D from 1D”MWE 来说明:

def pc(idx):
    return idx - Npts*int(idx/Npts)

uu = np.square(np.arange(Npts))
uv = np.zeros((Npts,Npts))
for kx in np.arange(Npts):
    for qx in np.arange(Npts):
        uv[kx,qx] = uu[pc(kx+qx)]

这里,周期性条件pc 只是将索引带回到允许的范围内。 Npts=4 的输出是:

array([[0., 1., 4., 9.],
       [1., 4., 9., 0.],
       [4., 9., 0., 1.],
       [9., 0., 1., 4.]])

这样每个值都会稍微移动。对于“4D from 2D”的情况,我显然可以使用:

def pbc(idx):
    return idx - Npts*int(idx/Npts)

uv = np.zeros((Npts,Npts,Npts,Npts))
for kx in np.arange(Npts):
    for ky in np.arange(Npts):
        for qx in np.arange(Npts):
            for qy in np.arange(Npts):
                uv[kx,ky,qx,qy] = uu[pbc(kx+qx),pbc(ky+qy)]

但是,使用四个循环会很慢,因为我会为更大的数组多次执行此操作。我怎样才能更有效地做到这一点?

请注意,虽然可以通过将 square 函数应用于 2D 数组来重现 MWE 示例,但这不是一个有用的解决方案。使用 MWE 来说明,目标是尽可能少地应用函数(即仅在 1D 数组上),然后创建没有 for 循环的 2D 数组。最终,我需要这样做以从 2D 数组生成 4D 数组。我该怎么做?

【问题讨论】:

    标签: python arrays performance numpy


    【解决方案1】:

    您可以复制二维数组,然后提取移位的二维子数组(避免模数和条件)。以下是如何做到这一点:

    uuRep = np.tile(uu, (2,2))
    uv = np.zeros((Npts,Npts,Npts,Npts))
    for kx in np.arange(Npts):
        for ky in np.arange(Npts):
            uv[kx,ky,:,:] = uuRep[kx:kx+Npts,ky:ky+Npts]
    

    使用Npts=64,此解决方案的速度大约是1000 倍

    【讨论】:

      最近更新 更多