来自 numpy 二维数组的窗口值
Windowing values from numpy 2D array
我有一个二维值数组,A。我想 window 这个数组中的值围绕一维数组 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: only size-1 arrays can be converted to Python scalars
我已经尝试使用预分配我的 window 数组,但得到了同样的错误。我试图避免使用 for 循环并执行此矢量化。
本质上,我想为 b 周围的 20 行 window 中的每一列获取 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]
我想创建一个新的二维数组,其中包含此 window 行中 A 的值。
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 您想从 39:59
列索引 A[0]
,从 37:57
索引 A[1]
等等...所以首先让我们创建一个用于索引 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]])
我有一个二维值数组,A。我想 window 这个数组中的值围绕一维数组 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: only size-1 arrays can be converted to Python scalars
我已经尝试使用预分配我的 window 数组,但得到了同样的错误。我试图避免使用 for 循环并执行此矢量化。
本质上,我想为 b 周围的 20 行 window 中的每一列获取 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]
我想创建一个新的二维数组,其中包含此 window 行中 A 的值。
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 您想从 39:59
列索引 A[0]
,从 37:57
索引 A[1]
等等...所以首先让我们创建一个用于索引 A
:
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]])