numpy 2D数组的窗口值

时间:2019-05-02 22:29:33

标签: python numpy indexing vectorization

我有一个二维数组值A。我想将该数组内的值围绕一维数组b给出的索引进行窗口化。

import numpy as np
A = np.random.randint(1000, size=(100, 100))
b = np.random.randint(40,60, size=(100))
window = A[b[:]-10 : b[:]+10, :]

但是,运行此程序时出现以下错误:

  

TypeError:只有大小为1的数组可以转换为Python标量

我尝试使用预先分配我的窗口数组,但遇到相同的错误。我试图避免使用for循环并进行矢量化处理。

基本上,我想在围绕b的20行窗口中获取每一列的A值。

print(b[:]-10,:)

给予:

  

[47 40 46 30 42 36 48 33 37 41 49 31 41 40 39 48 39 48 42 37 48 37 31 32    49 43 32 39 45 41 30 48 30 46 31 39 48 44 36 30 40 45 47 34 49 46 41 43    30 38 31 35 42 48 49 42 32 33 42 48 48 39 31 32 45 39 36 49 31 44 48 30    33 47 33 48 36 38 42 30 49 43 41 34 39 49 39 45 42 38 39 45 47 40 46 35    41 39 47 38]

print(b[:]+10,:)

给予:

  

[67 60 66 50 62 56 68 53 57 61 69 51 61 60 59 68 59 68 62 57 68 57 51 52    69 63 52 59 65 61 50 68 50 66 51 59 68 64 56 50 60 65 67 54 69 66 61 63    50 58 51 55 62 68 69 62 52 53 62 68 68 59 51 52 65 59 56 69 51 64 68 50    53 67 53 68 56 58 62 50 69 63 61 54 59 69 59 65 62 58 59 65 67 60 66 55    61 59 67 58]

我想创建一个新的2D数组,该数组保存该行窗口中A中的值。

1 个答案:

答案 0 :(得分:0)

IIUC是解决此问题的一种方法:

A = np.random.randint(1000, size=(100, 100))
b = np.random.randint(40,60, size=(100))

b可能是:

array([49, 47, 40, 44, 53, 47...

例如,给定b[0],IIUC,您想从A[0]列中索引39:59,从A[1]中索引37:57,依此类推……等等。首先,我们创建一个用于索引A的ndarray:

ar = np.arange(-10, 11)
ix = np.add.outer(b,ar)

array([[39, 40, 41, ..., 57, 58, 59],
       [37, 38, 39, ..., 55, 56, 57],
       [30, 31, 32, ..., 48, 49, 50],
       ...,

现在,我们可以使用ix来索引A并获得一个(100, 20)数组,其中每一行都包含感兴趣的列。为此,我们可以使用advanced indexing

A[np.arange(len(b))[:,None], ix][:,:-1]

array([[448, 963, 199, ...,  40, 300, 623],
       [258, 905, 862, ..., 517, 671, 399],
       [629, 408,  83, ..., 490, 883,  68],
       ...,
       [188, 368, 598, ..., 579, 925, 739],
       [131, 318,  28, ..., 444, 487, 362],
       [135, 801, 123, ..., 308, 579,  41]])