【问题标题】:Copy 2D array to a 3D one - Python / NumPy将 2D 数组复制到 3D 数组 - Python / NumPy
【发布时间】:2016-04-07 04:43:36
【问题描述】:

我年轻的时候会编程一点,但我从来都不是很好。我发现 Python 非常适合我想做的事情。

我有一个 Excel 文件,其中包含我使用 numpy genfromtxt 函数读取的数据(64 列,18496 行)。我想将所有内容放在一个名为 H 的 3D 矩阵中。我使用三个循环来这样做,但我知道这不是最有效的。

data = np.genfromtxt(filename, delimiter = ";",skiprows = 11) 
H = np.zeros((N,N,Nt))

for k in np.arange(N):
    for l in np.arange(N):            
        for m in np.arange(Nt):    
            H[k,l,m] = data[m+Nt*k,l]

是否有切割器(计算速度更快)可以这样做。我虽然想使用 numpy 形状,但我做不到。

谢谢

【问题讨论】:

    标签: python arrays performance numpy vectorization


    【解决方案1】:

    您可以使用np.reshape 重新调整形状,然后使用np.transpose 重新排列尺寸,就像这样 -

    H = data.reshape(N,Nt,N).transpose(0,2,1)
    

    除了np.transpose,也可以使用np.swapaxes,因为基本上我们在那里交换axes 1,2,就像这样-

    H = data.reshape(N,Nt,N).swapaxes(1,2)
    

    示例运行 -

    In [300]: N = 2
         ...: Nt = 3
         ...: data = np.random.randint(0,9,(N*Nt,N))
         ...: 
    
    In [301]: data
    Out[301]: 
    array([[3, 6],
           [7, 4],
           [8, 1],
           [8, 7],
           [4, 8],
           [2, 3]])
    
    In [302]: H = np.zeros((N,N,Nt),dtype=data.dtype)
         ...: for k in np.arange(N):
         ...:     for l in np.arange(N):            
         ...:         for m in np.arange(Nt):    
         ...:             H[k,l,m] = data[m+Nt*k,l]
         ...:             
    
    In [303]: H
    Out[303]: 
    array([[[3, 7, 8],
            [6, 4, 1]],
    
           [[8, 4, 2],
            [7, 8, 3]]])
    
    In [304]: data.reshape(N,Nt,N).transpose(0,2,1)
    Out[304]: 
    array([[[3, 7, 8],
            [6, 4, 1]],
    
           [[8, 4, 2],
            [7, 8, 3]]])
    

    运行时测试-

    In [8]: # Input
       ...: N = 10
       ...: Nt = 10*50
       ...: data = np.random.randint(0,9,(N*Nt,N))
       ...: 
       ...: def original_app(data):
       ...:     H = np.zeros((N,N,Nt),dtype=data.dtype)
       ...:     for k in np.arange(N):
       ...:         for l in np.arange(N):            
       ...:             for m in np.arange(Nt):    
       ...:                 H[k,l,m] = data[m+Nt*k,l]
       ...:     return H
       ...: 
    
    In [9]: np.allclose(original_app(data),data.reshape(N,Nt,N).transpose(0,2,1))
    Out[9]: True
    
    In [10]: %timeit original_app(data)
    10 loops, best of 3: 56.1 ms per loop
    
    In [11]: %timeit data.reshape(N,Nt,N).transpose(0,2,1)
    1000000 loops, best of 3: 1.25 µs per loop
    

    【讨论】:

    • @Fred 如果您没有明确指定 dtype,np.zeros 将默认创建一个 float 数组。如果 data 不是 float 数组,这可能会产生不良后果。
    猜你喜欢
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多