为每个元素使用唯一的填充来填充数组中的元素

2024-09-28 20:35:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python很陌生,读过很多关于这个主题的问题,但是没有一个能回答我的需要

我的结局是:

[[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实现这一点


Tags: 方法元素目标主题fornp原理ndarray
1条回答
网友
1楼 · 发布于 2024-09-28 20:35:29

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

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)

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

相关问题 更多 >