【发布时间】:2019-01-06 07:27:48
【问题描述】:
我目前正在尝试找到一种简单的方法来对 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 × 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
【问题讨论】:
标签: python arrays numpy numpy-ndarray