【问题标题】:How to translate / shift a numpy array?如何翻译/移动一个numpy数组?
【发布时间】:2019-10-28 07:08:24
【问题描述】:

我不确定要搜索什么关键字,所以如果已经询问过,请链接响应并关闭此线程。

我正在尝试将 numpy 数组的非零条目按固定方向移动,例如,假设我有一个二维数组:

0 1 2 0
0 3 0 0
0 0 0 0
0 0 0 0

将其移动 (1,1) 将产生以下数组:

0 0 0 0
0 0 1 2
0 0 3 0
0 0 0 0

假设如果非零条目超出范围,它们就会被丢弃。我该怎么做?

编辑:显然有些重复? Shift elements in a numpy array 我真的不明白为什么它们根本是同一个问题,因为那个人谈论的是使事物不受约束地循环,因此它更像是一种“滚动”动作而不是转移。我也喜欢这里的解决方案,它非常简单易读。

再次编辑:修复了一些格式

【问题讨论】:

  • 保存您可能正在寻找的边缘行为np.roll。您也可以从切片构造一个新数组。
  • 请将您的值编辑为 1,2,3 而不是 2,2,2,这样我们就可以看到您想要什么样的转变,现在可以有很多不同的东西
  • shift=(1,1); new=np.zeros_like(old); new[shift[0]:,shift[1]:]=old[:-shift[0],:-shift[1]] 之类的东西会出现一些错误。

标签: python arrays numpy


【解决方案1】:

使用 numpy 中的 roll 方法。

>>> import numpy as np
>>> m
array([[0, 1, 2, 0],
       [0, 3, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0]])
>>> m = np.roll(m, 1, axis=0) # shift 1 place in horizontal axis
>>> m = np.roll(m, 1, axis=1) # shift 1 place in vertical axis
>>> m
array([[0, 0, 0, 0],
       [0, 0, 1, 2],
       [0, 0, 3, 0],
       [0, 0, 0, 0]])

https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.roll.html

【讨论】:

    【解决方案2】:

    要简单地管理边缘,您可以将数组放大为更大的:

    square=\
    array([[0, 2, 2, 0],
           [0, 2, 0, 0],
           [0, 0, 0, 0],
           [0, 0, 0, 0]], dtype=int64)
    
    n,m=square.shape
    bigsquare=np.zeros((3*n,3*m),square.dtype) 
    bigsquare[n:2*n,m:2*m]=square
    

    那么 shift 只是一个视图:

    def shift(dx,dy):
        x=n-dx
        y=m-dy
        return bigsquare[x:x+n,y:y+m]
    
    print(shift(1,1))
    
    #[[0 0 0 0]
    # [0 0 2 2]
    # [0 0 2 0]
    # [0 0 0 0]]
    

    【讨论】:

    • 这是一个副本的视图,信息量不大。
    • @AndrasDeak 啊,无论如何我并不是要在原地编辑,副本对我来说很好,因为我的大部分东西都可以正常使用
    • @EvanPu 我知道,你真的不能以任何其他方式做到这一点。我刚刚反思了 B. M. 的“转变只是一个观点”这句话。
    猜你喜欢
    • 2021-03-15
    • 2020-04-01
    • 2012-03-28
    • 1970-01-01
    • 2016-04-14
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多