如何实现numpy数组行逐次向下移位(每次下移一行补零)
Numpy实现行下移补0的方法
Numpy没有直接对应此需求的预定义函数,但可以通过简单的切片操作或结合np.roll快速实现,以下是几种实用方案:
方案1:切片赋值(推荐,直观高效)
通过创建全0数组,将原数组的前n-1行赋值到新数组的后n-1行,顶部自动补0:
import numpy as np def shift_down(arr): # 创建与原数组形状一致的全0数组 shifted = np.zeros_like(arr) # 将原数组的前m-1行(m为总行数)赋值给新数组的第1行及以后 shifted[1:] = arr[:-1] return shifted # 测试用例 original_arr = np.array([ [1,1,1,1,1], [2,2,2,2,2], [3,3,3,3,3], [4,4,4,4,4] ]) # 第一次调用 result1 = shift_down(original_arr) print(result1) # 输出: # [[0 0 0 0 0] # [1 1 1 1 1] # [2 2 2 2 2] # [3 3 3 3 3]] # 第二次调用 result2 = shift_down(result1) print(result2) # 输出: # [[0 0 0 0 0] # [0 0 0 0 0] # [1 1 1 1 1] # [2 2 2 2 2]]
方案2:原地修改(节省内存)
如果不需要保留原数组,可以直接在原数组上操作,避免创建新数组:
def shift_down_inplace(arr): # 先复制原数组的前m-1行 temp = arr[:-1].copy() # 将原数组全部置0 arr[:] = 0 # 把复制的行赋值到原数组的第1行及以后 arr[1:] = temp # 测试 arr = original_arr.copy() shift_down_inplace(arr) print(arr) # 得到第一次调用的结果 shift_down_inplace(arr) print(arr) # 得到第二次调用的结果
方案3:结合np.roll实现
利用np.roll的行滚动功能,再将顶部行置0,适合熟悉roll函数的场景:
def shift_down_with_roll(arr): # 将所有行向下滚动1位(最后一行会移到第一行) rolled = np.roll(arr, 1, axis=0) # 将第一行置0 rolled[0] = 0 return rolled # 测试 result1 = shift_down_with_roll(original_arr) result2 = shift_down_with_roll(result1)
内容的提问来源于stack exchange,提问作者shanster
相关产品推荐
相关产品推荐

