为每个元素使用唯一的填充来填充 ndarray 中的元素
Pad elements in ndarray using unique padding for each element
我对 python 很陌生,已经阅读了很多关于这个主题的 SO 问题,但是 none 回答了我的需求。
我最终得到了一个 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
实现此目的?
这是一个基于循环的解决方案,但根据输入数组和填充的维度创建了一个零数组。评论中的解释:
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()
尚不支持这种填充,即使它已经提供了所有可用的附加模式和关键字参数。
我对 python 很陌生,已经阅读了很多关于这个主题的 SO 问题,但是 none 回答了我的需求。
我最终得到了一个 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
实现此目的?
这是一个基于循环的解决方案,但根据输入数组和填充的维度创建了一个零数组。评论中的解释:
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()
尚不支持这种填充,即使它已经提供了所有可用的附加模式和关键字参数。