为每个数据列填充一个带有偏移量的numpy数组

时间:2018-07-30 15:53:31

标签: python arrays performance numpy

我正在使用二维numpy数组,这些数组在行数和列数方面表现出可变的大小。我想在第一行的开始之前和最后一行的结尾处都用零填充该数组,但是我希望零的开始/结束以不同的方式针对数据。

原来的2D数组:

1 2 3 
4 5 6
7 8 9

填充的正常示例:

0 0 0
0 0 0
1 2 3
4 5 6
7 8 9
0 0 0

具有偏移量的修改的填充(我正在尝试做的事情):

0 0 0
1 0 0 
4 0 3
7 2 6
0 5 9
0 8 0

numpy是否具有任何可以以可扩展方式复制最后一个示例的函数,用于可变数量的行/列,从而避免使用for循环/其他计算缓慢的方法?

3 个答案:

答案 0 :(得分:2)

这是带有broadcastingboolean-indexing的矢量化对象-

def create_padded_array(a, row_start, n_rows):
    r = np.arange(n_rows)[:,None]
    row_start = np.asarray(row_start)
    mask = (r >= row_start) & (r < row_start+a.shape[0])

    out = np.zeros(mask.shape, dtype=a.dtype)
    out.T[mask.T] = a.ravel('F')
    return out   

样品运行-

In [184]: a
Out[184]: 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

In [185]: create_padded_array(a, row_start=[1,3,2], n_rows=6)
Out[185]: 
array([[0, 0, 0],
       [1, 0, 0],
       [4, 0, 3],
       [7, 2, 6],
       [0, 5, 9],
       [0, 8, 0]])

答案 1 :(得分:1)

很抱歉遇到了麻烦,但是我想我找到了我想要的答案。

我可以使用numpy.pad在原始数组的末尾创建任意数量的填充零。还有一个名为numpy.roll的函数,该函数随后可用于沿给定轴将所有数组元素沿列向下移动一定数量的位置。

经过快速测试,它似乎可以扩展到任意数量的矩阵元素,并允许沿每一列的唯一偏移量。

感谢大家对这个问题的回答!

答案 2 :(得分:0)

据我所知,没有那些具有确切特定要求的numpy函数,但是您可以做的是拥有数组:

`

byte[] AESKey = c.doFinal(encryptedKey.getBytes());

然后垫上它:

byte[] AESKey = c.doFinal(encryptedKey);

然后,您可以使用随机播放功能(我认为这是您想要做的): 但是np.random.shuffle仅在满足您需求的情况下才对行进行随机排序:

In [10]: arr = np.array([(1,2,3),(4,5,6),(7,8,9)])

In [11]: arr

Out[11]: 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])`

如果这不令人满意,您可以这样做:


首先创建一维数组:

In [12]: arr = np.pad(arr, ((2,1),(0,0)), 'constant', constant_values=(0))

In [13]: arr
Out[13]: 
array([[0, 0, 0],
       [0, 0, 0],
       [1, 2, 3],
       [4, 5, 6],
       [7, 8, 9],
       [0, 0, 0]])

然后用零填充数组:

In [14]: np.random.shuffle(arr)
In [15]: arr
Out[15]: 
array([[7, 8, 9],
       [4, 5, 6],
       [0, 0, 0],
       [0, 0, 0],
       [0, 0, 0],
       [1, 2, 3]])

然后您对数组进行混洗:

In [16]: arr = np.arange(1,10)

In [17]: arr
Out[17]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])

最后,您将形状调整为所需的格式:

In [18]: arr = np.pad(arr, (6,3), 'constant', constant_values = (0))

In [19]: arr
Out[19]: array([0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0])

尽管这可能看起来很长,但是对于大型数据集而言,这比用于循环或任何其他python控制结构的速度要快得多。当您说偏移量时,如果您想更改随机量,则可以选择只对1D数组的一部分进行混洗,然后将其与其余数据合并,这样就不会对整个数据集进行混洗,而只是对一部分数据进行混洗洗牌是。 (如果偏移量的含义不同于我上面的假设,请在评论中进行澄清)