python - 列值到行值的 Numpy 转换

标签 python performance numpy matrix

我取一列(第三列)的 3 个值,并将这些值放入 3 个新列的一行中。并将新旧列合并成一个新的矩阵A

在第 1 列和第 2 列的第 3 列值中输入时间序列

[x x 1]
[x x 2]
[x x 3]

输出:矩阵A

[x x 1 0 0 0]
[x x 2 0 0 0]
[x x 3 1 2 3]
[x x 4 2 3 4]

为简洁起见,首先代码生成矩阵 6 行/3 列。我想用最后一列来填充 3 个额外的列并将其合并到一个新的矩阵 A 中。这个矩阵 A 预填充了 2 行以偏移起始位置。

我已经在下面的代码中实现了这个想法,处理大型数据集需要很长时间。 如何提高这种转换的速度

import  numpy as np

matrix = np.arange(18).reshape((6, 3))

nr=3 
A = np.zeros((nr-1,nr))

for x in range( matrix.shape[0]-nr+1):
    newrow =  (np.transpose( matrix[x:x+nr,2:3] ))
    A = np.vstack([A , newrow])

total= np.column_stack((matrix,A))
print (total)

最佳答案

这是一种使用 broadcasting 的方法获取那些滑动窗口元素,然后只是一些堆叠以获得 A -

col2 = matrix[:,2]
nrows = col2.size-nr+1
out = np.zeros((nr-1+nrows,nr))
col2_2D = np.take(col2,np.arange(nrows)[:,None] + np.arange(nr))
out[nr-1:] = col2_2D

这是使用 NumPy strides 的有效替代方法获取 col2_2D -

n = col2.strides[0]
col2_2D = np.lib.stride_tricks.as_strided(col2, shape=(nrows,nr), strides=(n,n))

最好将大小为 total 的零输出数组初始化,然后用 col2_2D 赋值给它,最后用输入数组 赋值矩阵

运行时测试

作为函数的方法 -

def org_app1(matrix,nr):    
    A = np.zeros((nr-1,nr))
    for x in range( matrix.shape[0]-nr+1):
        newrow =  (np.transpose( matrix[x:x+nr,2:3] ))
        A = np.vstack([A , newrow])
    return A

def vect_app1(matrix,nr):    
    col2 = matrix[:,2]
    nrows = col2.size-nr+1
    out = np.zeros((nr-1+nrows,nr))
    col2_2D = np.take(col2,np.arange(nrows)[:,None] + np.arange(nr))
    out[nr-1:] = col2_2D
    return out

def vect_app2(matrix,nr):    
    col2 = matrix[:,2]
    nrows = col2.size-nr+1
    out = np.zeros((nr-1+nrows,nr))
    n = col2.strides[0]
    col2_2D = np.lib.stride_tricks.as_strided(col2, \
                        shape=(nrows,nr), strides=(n,n))
    out[nr-1:] = col2_2D
    return out

时间和验证-

In [18]: # Setup input array and params
    ...: matrix = np.arange(1800).reshape((60, 30))
    ...: nr=3
    ...: 

In [19]: np.allclose(org_app1(matrix,nr),vect_app1(matrix,nr))
Out[19]: True

In [20]: np.allclose(org_app1(matrix,nr),vect_app2(matrix,nr))
Out[20]: True

In [21]: %timeit org_app1(matrix,nr)
1000 loops, best of 3: 646 µs per loop

In [22]: %timeit vect_app1(matrix,nr)
10000 loops, best of 3: 20.6 µs per loop

In [23]: %timeit vect_app2(matrix,nr)
10000 loops, best of 3: 21.5 µs per loop

In [28]: # Setup input array and params
    ...: matrix = np.arange(7200).reshape((120, 60))
    ...: nr=30
    ...: 

In [29]: %timeit org_app1(matrix,nr)
1000 loops, best of 3: 1.19 ms per loop

In [30]: %timeit vect_app1(matrix,nr)
10000 loops, best of 3: 45 µs per loop

In [31]: %timeit vect_app2(matrix,nr)
10000 loops, best of 3: 27.2 µs per loop

关于python - 列值到行值的 Numpy 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40128895/

相关文章:

python - Python中不是真的有封装吗

Python素数生成器产量与返回

python - “Pip”在命令提示符中识别但在 PyCharm 终端中不识别

c++ - `std::sort` 内部使用了什么魔法让它更快?

python - 使用ctypes时如何替换libm?

android - 带有 getView() 的 ListView 由于不断的 GC 而过度缓慢?

performance - 何时在我的tal :condition?上使用nocall

python - Raspberry Pi 上的 Numpy 导入错误 Python3?

python - 矩阵作为字典键

python - 检查numpy数组是否是多维的