【问题标题】:Shifting 3D numpy array移动 3D numpy 数组
【发布时间】:2013-04-09 07:53:55
【问题描述】:

我希望能够沿高度轴在任一方向移动 3D numpy 数组。 如果给出 3 的正位移,则数组中的所有值都向上移动,并且 3 个新的零切片出现在数组的底部。如果给出负位移,则会发生相反的情况,所有切片沿高度轴向下移动,新的零切片出现在顶部。

我尝试将数组重新整形为 1D 并左右移动,然后返回 3D。但是,这会使阵列沿错误的方向移动。我尝试在重塑之前实现 numpy.rollaxis ,从而沿着正确的轴移动。但是我正在开发的系统无法识别所有 numpy 函数,并且不会执行 rollaxis。

谢谢!

【问题讨论】:

  • 您能否发布到目前为止的尝试并告诉我们您遇到了什么错误?
  • “但是我正在使用的系统无法识别所有 numpy 函数”是什么意思?

标签: python arrays numpy 3d shift


【解决方案1】:

你的问题有点不明确。首先,“高度”轴对于您在 3D 阵列中所追求的不是一个非常明确的定义。最好通过形状元组中的位置来定位它们。我将把它理解为“沿着第一个轴”,但是对于不同的轴应该如何做到这一点应该很明显。

其次,虽然很明显您希望零来填充移位的数据,但您没有指定要对另一侧的数据做什么:它应该消失在数组边界之外并丢失吗?还是应该扩展数组以保留所有内容?

对于前者,numpy 具有roll 函数,它的功能与您想要的类似,但它不是用零填充,而是从数组的另一端复制数据。之后您可以简单地用零替换它:

>>> a = np.arange(60).reshape(3, 4, 5)
>>> a
array([[[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19]],

       [[20, 21, 22, 23, 24],
        [25, 26, 27, 28, 29],
        [30, 31, 32, 33, 34],
        [35, 36, 37, 38, 39]],

       [[40, 41, 42, 43, 44],
        [45, 46, 47, 48, 49],
        [50, 51, 52, 53, 54],
        [55, 56, 57, 58, 59]]])
>>> b = np.roll(a, 2, axis=0)
>>> b[:2,:, :] = 0
>>> b
array([[[ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0]],

       [[ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0]],

       [[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19]]])

如果转变为负数,您将选择b[-shift:, :, :] = 0,而不是b[:shift, :, :] = 0

如果您不想丢失数据,那么您基本上只是在数组的顶部或底部添加零片。对于前三个维度,numpy 有vstackhstackdstack,而vstack 应该是你所追求的:

>>> a = np.arange(60).reshape(3, 4, 5)
>>> b = np.vstack((np.zeros((2,)+a.shape[1:], dtype=a.dtype), a))
>>> b
array([[[ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0]],

       [[ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0],
        [ 0,  0,  0,  0,  0]],

       [[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19]],

       [[20, 21, 22, 23, 24],
        [25, 26, 27, 28, 29],
        [30, 31, 32, 33, 34],
        [35, 36, 37, 38, 39]],

       [[40, 41, 42, 43, 44],
        [45, 46, 47, 48, 49],
        [50, 51, 52, 53, 54],
        [55, 56, 57, 58, 59]]])

如果您希望在底部附加零,只需更改调用堆栈函数中的参数顺序即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 2012-12-09
    • 2017-01-14
    相关资源
    最近更新 更多