【问题标题】:Pad elements in ndarray using unique padding for each element使用每个元素的唯一填充来填充 ndarray 中的元素
【发布时间】:2019-09-16 19:30:20
【问题描述】:

我对 python 很陌生,并且已经阅读了很多关于这个主题的 SO 问题,但是没有一个能满足我的需求。

我最终得到了一个 ndarray:

[[1, 2, 3]
 [4, 5, 6]]

现在我想为每个元素(例如[1, 2, 3])使用专门针对该元素的填充来填充。当然,我可以在 for 循环中执行此操作,并将每个结果附加到一个新的 ndarray 中,但是是否有一种更快、更简洁的方法可以一次将其应用于整个 ndarray?

我想它可以像这样工作:

myArray = [[1, 2, 3]
           [4, 5, 6]]

paddings = [(1, 2),
            (2, 1)]

myArray = np.pad(myArray, paddings, 'constant')

当然这只是输出:

[[0 0 0 0 0 0 0 0 0]
 [0 0 1 2 3 0 0 0 0]
 [0 0 3 4 5 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 0 0]
 [0 0 4 5 6 0]]

如何使用numpy 实现这一目标?

【问题讨论】:

  • 你不能有一个包含形状不同元素的 numpy 数组......你必须要么接受你需要有一些填充的默认值,要么回退到 Python 列表列表...您能否就您为什么要这样做提供更多背景信息?根据原因,很可能还有其他解决方案。
  • 哦,谢谢您指出这一点!对不起,形状当然是一样的!我给你举了个坏例子!现在要编辑它
  • Err... 6 发生了什么?
  • 哈哈纠正了
  • 我做了一个小的编辑并添加了一些标签,以便可以回答这个问题的人有机会看到它......同时,如果你能解释一下你的填充旨在为您的示例工作 - 只是您的逻辑的一些基本原理等......它肯定会让某人更容易回答......(例如:我正在这样做,当我提供 X 时,它对我的行执行 Y,因为 Z...)

标签: python python-3.x numpy numpy-ndarray zero-padding


【解决方案1】:

这是一个基于循环的解决方案,但根据输入数组和填充的维度创建一个 zeros 数组。 cmets中的解释:

In [192]: myArray
Out[192]: 
array([[1, 2, 3],
       [4, 5, 6]])

In [193]: paddings
Out[193]: 
array([[1, 2],
       [2, 1]])

# calculate desired shape; needed for initializing `padded_arr`
In [194]: target_shape = (myArray.shape[0], myArray.shape[1] + paddings.shape[1] + 1)

In [195]: padded_arr = np.zeros(target_shape, dtype=np.int32)

In [196]: padded_arr
Out[196]: 
array([[0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0]], dtype=int32)

在此之后,我们可以使用for 循环根据来自paddings 的值填充来自myArray 的序列:

In [199]: for idx in range(paddings.shape[0]):
     ...:     padded_arr[idx, paddings[idx, 0]:-paddings[idx, 1]] = myArray[idx]
     ...:     

In [200]: padded_arr
Out[200]: 
array([[0, 1, 2, 3, 0, 0],
       [0, 0, 4, 5, 6, 0]], dtype=int32)

我们不得不求助于基于循环的解决方案的原因是,numpy.lib.pad() 还不支持这种填充,即使它已经提供了所有可用的附加模式和关键字参数。

【讨论】:

    猜你喜欢
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 2016-02-10
    • 1970-01-01
    相关资源
    最近更新 更多