gpt4 book ai didi

python - NumPy 数组的滚动/增加维数

转载 作者:太空宇宙 更新时间:2023-11-03 11:16:04 28 4
gpt4 key购买 nike

我目前正在尝试找到一种简单的方法来在 Python 中对 N 维数组执行以下操作。为简单起见,让我们从大小为 4 的一维数组开始。

X = np.array([1,2,3,4])

我想做的是创建一个新数组,将其命名为 Y,这样:

Y = np.array([1,2,3,4],[2,3,4,1],[3,4,1,2],[4,1,2,3])

所以我想做的是创建一个数组 Y,这样:

Y[:,i] = np.roll(X[:],-i, axis = 0)

我知道如何使用 for 循环来执行此操作,但我正在寻找一种更快的方法来执行此操作。我尝试这样做的实际数组是一个 3 维数组,称之为 X。我正在寻找的是一种找到数组 Y 的方法,这样:

Y[:,:,:,i,j,k] = np.roll(X[:,:,:],(-i,-j,-k),axis = (0,1,2))

我可以通过使用 for 循环的 itertools.product 类来做到这一点,但这非常慢。如果有人有更好的方法来做到这一点,请告诉我。我还在 GTX-970 上安装了 CUPY,所以如果有使用 CUDA 更快地完成此操作的方法,请告诉我。如果有人想要更多背景信息,请告诉我。

这是我计算位置空间两点相关函数的原始代码。数组 x0 是一个 n x n x n 实数值数组,表示实数标量场。函数 iterate(j,s) 运行 j 次迭代。每次迭代包括为每个晶格位置在 -s 和 s 之间生成一个随机 float 。然后它计算 Action dS 的变化并以 min(1,exp^(-dS)) 的概率接受变化

def momentum(k,j,s):
global Gxa
Gx = numpy.zeros((n,n,t))
for i1 in range(0,k):
iterate(j,s)
for i2,i3,i4 in itertools.product(range(0,n),range(0,n),range(0,n)):
x1 = numpy.roll(numpy.roll(numpy.roll(x0, -i2, axis = 0),-i3, axis = 1),-i4,axis = 2)
x2 = numpy.mean(numpy.multiply(x0,x1))
Gx[i2,i3,i4] = x2
Gxa = Gxa + Gx
Gxa = Gxa/k

最佳答案

方法 #1

我们可以扩展this idea到这里的 3D 数组案例。因此,只需将三个维度的切片版本连接起来,然后使用 np.lib.stride_tricks.as_strided基于 scikit-image's view_as_windows有效地获得最终输出作为串联版本的跨步 View ,就像这样 -

from skimage.util.shape import view_as_windows

X1 = np.concatenate((X,X[:,:,:-1]),axis=2)
X2 = np.concatenate((X1,X1[:,:-1,:]),axis=1)
X3 = np.concatenate((X2,X2[:-1,:,:]),axis=0)
out = view_as_windows(X3,X.shape)

方法 #2

对于非常大的数组,我们可能希望初始化输出数组,然后重新使用早期方法中的 X3 来对其进行切片赋值。这种切片过程会比原来的滚动过程更快。实现将是 -

m,n,r = X.shape
Yout = np.empty((m,n,r,m,n,r),dtype=X.dtype)
for i in range(m):
for j in range(n):
for k in range(r):
Yout[:,:,:,i,j,k] = X3[i:i+m,j:j+n,k:k+r]

关于python - NumPy 数组的滚动/增加维数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51587306/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com