Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 滚动/增加NumPy数组的维数_Python_Arrays_Numpy_Numpy Ndarray - Fatal编程技术网

Python 滚动/增加NumPy数组的维数

Python 滚动/增加NumPy数组的维数,python,arrays,numpy,numpy-ndarray,Python,Arrays,Numpy,Numpy Ndarray,我目前正试图找到一种简单的方法来对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[:,i] = np.roll(X[:],-i, axis = 0) Y[:,:,:,i,j,k] = np.roll(X[:,:,:],(-i,-j,-k),axis

我目前正试图找到一种简单的方法来对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[:,i] = np.roll(X[:],-i, axis = 0)
Y[:,:,:,i,j,k] = np.roll(X[:,:,:],(-i,-j,-k),axis = (0,1,2))
所以我要做的是创建一个数组Y,这样:

Y = np.array([1,2,3,4],[2,3,4,1],[3,4,1,2],[4,1,2,3])
Y[:,i] = np.roll(X[:],-i, axis = 0)
Y[:,:,:,i,j,k] = np.roll(X[:,:,:],(-i,-j,-k),axis = (0,1,2))
我知道如何使用for循环来实现这一点,但我正在寻找一种更快的方法。我尝试这样做的实际数组是一个三维数组,称之为X。我要寻找的是一种找到数组Y的方法,例如:

Y = np.array([1,2,3,4],[2,3,4,1],[3,4,1,2],[4,1,2,3])
Y[:,i] = np.roll(X[:],-i, axis = 0)
Y[:,:,:,i,j,k] = np.roll(X[:,:,:],(-i,-j,-k),axis = (0,1,2))
我可以使用itertools.product类使用for循环来实现这一点,但这相当慢。如果有人有更好的方法,请告诉我。我也有丘比安装了GTX-970,所以如果有一种方法可以使用CUDA更快地做到这一点,请让我知道。如果有人想了解更多情况,请告诉我

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

方法#1

我们可以在这里扩展到我们的
3D
阵列案例。因此,只需沿三个DIM连接切片版本,然后使用BASE有效地获得最终输出,作为连接版本的跨步视图,如下所示-

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]

令人惊叹的!我得到了很好的加速。坏消息;我现在被限制在三维空间中的最大晶格尺寸约为33(我在模拟晶格量子场论),因为如果超过这个尺寸,我会得到一个内存错误,因为33^6是一个非常大的数字。有什么办法可以解决这个问题吗?这真的不管用。我想当我在做np.multiply到element-wise的乘法时,实际的内存接收器会是新的六维矩阵与原始矩阵相乘,因为我试图计算格上相互作用理论的欧几里德(想象时间)格林函数。无论使用您的方法,我都可以探测晶格尺寸,这在以前对我来说是不可行的,所以谢谢@咯咯地笑着说-
它实际上不起作用,你是说方法2不起作用吗?如果是的话,你是说它速度慢还是输出错误?我已经检查了性能和正确性,我指的是方法2。它给出了正确的输出,似乎和第一个方法一样快,但我仍然达到了内存限制。“我会在有时间的时候再做一些测试,我会告诉你我发现了什么。”咯咯地笑着说,“好奇的是,你的滚动法也达到了内存限制了吗?”?如果是这样的话,我想我们没有别的办法了。