python - 矩阵:有效地将第 n 行移动 n 个位置

标签 python numpy matrix matrix-transform

我有一个 numpy 二维数组,我需要以第一行保持不变,第二行向右移动一个位置的方式对其进行转换,(它可以环绕或只在前面填充零) .第三行向右移动 3 个位置,依此类推。 我可以通过“for 循环”来做到这一点,但这不是很有效。我猜应该有一个乘以原始矩阵的过滤矩阵会产生相同的效果,或者可能是一个 numpy 技巧可以帮助我做到这一点?谢谢! 我研究过 numpy.roll() 但我认为它不能单独处理每一行。

import numpy as np
p = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])
'''
p = [ 1   2   3   4
      5   6   7   8
      9   10  11  12
      13  14  15  16]
desired output:
p'= [ 1   2   3   4
      0   5   6   7
      0   0   9   10
      0   0   0   13]
'''

最佳答案

我们可以将滑动窗口提取到输入的零填充版本中,以获得内存效率高的方法,从而提高性能。要获得这些窗口,我们可以利用 np.lib.stride_tricks.as_strided基于 scikit-image's view_as_windows . More info on use of as_strided based view_as_windows .

因此,解决方案是——

from skimage.util.shape import view_as_windows

def slide_by_one(p):
    m,n = p.shape
    z = np.zeros((m,m-1),dtype=p.dtype)
    a = np.concatenate((z,p),axis=1)
    w  = view_as_windows(a,(1,p.shape[1]))[...,0,:]
    r = np.arange(m)
    return w[r,r[::-1]]

sample 运行-

In [60]: p # generic sample of size mxn
Out[60]: 
array([[ 1,  5,  9, 13, 17],
       [ 2,  6, 10, 14, 18],
       [ 3,  7, 11, 15, 19],
       [ 4,  8, 12, 16, 20]])

In [61]: slide_by_one(p)
Out[61]: 
array([[ 1,  5,  9, 13, 17],
       [ 0,  2,  6, 10, 14],
       [ 0,  0,  3,  7, 11],
       [ 0,  0,  0,  4,  8]])

我们可以利用常规的 rampy 模式,通过更原始地使用 np.lib.stride_tricks.as_strided 来获得更有效的方法,就像这样 -

def slide_by_one_v2(p):
    m,n = p.shape
    z = np.zeros((m,m-1),dtype=p.dtype)
    a = np.concatenate((z,p),axis=1)
    s0,s1 = a.strides
    return np.lib.stride_tricks.as_strided(a[:,m-1:],shape=(m,n),strides=(s0-s1,s1))

另一个带有一些masking -

def slide_by_one_v3(p):
    m,n = p.shape
    z = np.zeros((len(p),1),dtype=p.dtype)
    a = np.concatenate((p,z),axis=1)
    return np.triu(a[:,::-1],1)[:,::-1].flat[:-m].reshape(m,-1)

关于python - 矩阵:有效地将第 n 行移动 n 个位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58694196/

相关文章:

python - pandas 在数据框中找到两条线的交点

python - scipy.stats.binom 库可以为特定的 "N"和 "k"返回值 "p"

python - 为什么将元组分配给带注释的变量需要括号?

python - Theano 损失函数中的对数行列式

r - 如何在给定 r 中的对角线和非对角线元素的情况下填充矩阵?

python - 如何使用 Google BigQuery python API 获得超过 100,000 个响应结果?

python - 从 numpy 中的一维向量映射二维延迟向量

python - Matplotlib 归一化颜色条 (Python)

css - 如何在没有的情况下动态调整矩阵以适应父宽度(以 JS 为例)

c++ opengl将模型坐标转换为世界坐标以进行碰撞检测