单独左移2D Numpy数组的每一行

wgxvkvu9  于 2022-11-24  发布在  其他
关注(0)|答案(3)|浏览(114)
A = np.array([[4, 3, 2],
              [1, 2, 3],
              [0, -1, 5]])

shift = np.array([1,2,1])

out = np.array([[3, 2, np.nan],
              [3, np.nan, np.nan],
              [-1, 5, np.nan]])

我想左移二维numpy数组向左每一行独立地作为给定的移位向量和插补与南右。
请帮我解决这个问题
谢谢

643ylb08

643ylb081#

import numpy as np

A = np.array([[4, 3, 2],
              [1, 2, 3],
              [0, -1, 5]])

shift = np.array([1,2,1])

x,y = A.shape
res = np.full(x*y,np.nan).reshape(x,y)

for i in range(x):
    for j in range(y):
        res[i][:(y-shift[i])]=A[i][shift[i]:]
print(res)
hgc7kmma

hgc7kmma2#

使用滚动矩阵Ref的行

from skimage.util.shape import view_as_windows as viewW
import numpy as np

A = np.array([[4, 3, 2],
              [1, 2, 3],
              [0, -1, 5]])

shift = np.array([1,1,1])

p = np.full((A.shape[0],A.shape[1]-1),np.nan)
a_ext = np.concatenate((A,p,p),axis=1)

n = A.shape[1]
shifted =viewW(a_ext,(1,n))[np.arange(len(shift)), -shift + (n-1),0]

print(shifted)

输出编号

[[ 3.  2. nan]
 [ 2.  3. nan]
 [-1.  5. nan]]
b1zrtrql

b1zrtrql3#

您应该只对每行使用一个for循环和np.roll
第一个
虽然有些人可能认为减少对np.roll的调用会有所帮助,但实际上并没有帮助,因为这正是np.roll在内部实现的方式,并且代码中将有2个循环而不是1个。

相关问题