编程语言
首页 > 编程语言> > python – NumPy数组的滚动/增加维度

python – NumPy数组的滚动/增加维度

作者:互联网

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

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))

我可以使用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

解决方法:

方法#1

我们可以在这里将this idea扩展到我们的3D阵列盒.因此,只需将三个dims上的切片版本连接起来,然后使用基于np.lib.stride_tricks.as_stridedscikit-image's view_as_windows来有效地获得最终输出作为连接版本的跨步视图,就像这样 –

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,arrays,numpy,numpy-ndarray
来源: https://codeday.me/bug/20190701/1346638.html