首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >滚动/增加NumPy数组的维数

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

Stack Overflow用户
提问于 2018-07-30 13:10:56
回答 1查看 146关注 0票数 4

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

代码语言:javascript
复制
X = np.array([1,2,3,4])

我想要做的是创建一个新的数组,称为Y,这样:

代码语言:javascript
复制
Y = np.array([1,2,3,4],[2,3,4,1],[3,4,1,2],[4,1,2,3])

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

代码语言:javascript
复制
Y[:,i] = np.roll(X[:],-i, axis = 0)

我知道如何使用for循环来做到这一点,但我正在寻找一种更快的方法。我尝试这样做的实际数组是一个三维数组,称为X。我正在寻找的是一种找到数组Y的方法,如下所示:

代码语言:javascript
复制
Y[:,:,:,i,j,k] = np.roll(X[:,:,:],(-i,-j,-k),axis = (0,1,2))

我可以使用itertools.product类和for循环来做这件事,但这样做相当慢。如果有人有更好的方法,请让我知道。我还安装了带有GTX-970的CUPY,所以如果有更快使用CUDA的方法,请告诉我。如果任何人想要更多的上下文,请让我知道。

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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-30 15:38:15

方法#1

我们可以在这里将this idea扩展到我们的3D数组情况。因此,只需沿着三个dims连接切片版本,然后使用基于np.lib.stride_tricks.as_stridedscikit-image's view_as_windows有效地获得最终输出,作为连接版本的步进视图,如下所示-

代码语言:javascript
复制
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对其进行分片赋值。这种切片过程将比原始滚动更快。它的实现方式是:

代码语言:javascript
复制
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]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51587306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档