我目前正在尝试找到在Python中对N维数组执行以下操作的简单方法。为了简单起见,让我们从一个大小为4的一维数组开始。
我想做的是创建一个新数组,叫做Y,使得:
我想要做的是创建一个数组Y,使得:
我知道如何使用for循环来完成这个任务,但我正在寻找一种更快的方法。我要处理的数组实际上是一个三维数组,称之为X。我正在寻找一种找到一个数组Y的方法,使得:
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循环来完成这个任务,但我正在寻找一种更快的方法。我要处理的数组实际上是一个三维数组,称之为X。我正在寻找一种找到一个数组Y的方法,使得:
Y[:,:,:,i,j,k] = np.roll(X[:,:,:],(-i,-j,-k),axis = (0,1,2))
我可以使用itertools.product类和for循环来完成这个任务,但是这样做非常慢。如果有更好的方法,请告诉我。我还安装了CUPY和GTX-970,如果有一种使用CUDA更快速地完成此任务的方法,请告诉我。如果需要更多上下文,请告诉我。
以下是计算位置空间两点关联函数的原始代码。数组x0是一个n乘以n乘以n的实值数组,表示实标量场。函数iterate(j,s)运行j次迭代。每次迭代都会为每个晶格点生成一个介于-s和s之间的随机浮点数。然后它计算作用量的变化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