Performance 如何使用索引数组从numpy数组中矢量化获取子数组
我想使用某种类型的索引数组(索引数组的样式/格式供建议使用),从基本数组中获得一个由子数组组成的numpy数组。我可以很容易地用for循环来实现这一点,但我想知道是否有一种聪明的方法来使用numpy广播 约束:子数组保证大小相同Performance 如何使用索引数组从numpy数组中矢量化获取子数组,performance,python-2.7,numpy,vectorization,array-broadcasting,Performance,Python 2.7,Numpy,Vectorization,Array Broadcasting,我想使用某种类型的索引数组(索引数组的样式/格式供建议使用),从基本数组中获得一个由子数组组成的numpy数组。我可以很容易地用for循环来实现这一点,但我想知道是否有一种聪明的方法来使用numpy广播 约束:子数组保证大小相同 up_idx = np.array([[0, 0], [0, 2], [1, 1]]) lw_idx = np.array([[2, 2], [2, 4],
up_idx = np.array([[0, 0],
[0, 2],
[1, 1]])
lw_idx = np.array([[2, 2],
[2, 4],
[3, 3]])
base = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
samples = []
for index in range(up_idx.shape[0]):
up_row = up_idx[index, 0]
up_col = up_idx[index, 1]
lw_row = lw_idx[index, 0]
lw_col = lw_idx[index, 1]
samples.append(base[up_row:lw_row, up_col:lw_col])
samples = np.array(samples)
print(samples)
> [[[ 1 2]
[ 5 6]]
[[ 3 4]
[ 7 8]]
[[ 6 7]
[10 11]]]
我试过:
vector_s = base[up_idx[:, 0]:lw_idx[:, 1], up_idx[:, 1]:lw_idx[:, 1]]
但这似乎是荒谬的。我不认为有一种快速的方法可以通过numpy广播操作来实现这一点——首先,设置问题的方式无法保证生成的子阵列将是相同的形状,因此能够适应单个输出阵列 解决这个问题最简洁有效的方法可能是通过列表理解;e、 g
result = np.array([base[i1:i2, j1:j2] for (i1, j1), (i2, j2) in zip(up_idx, lw_idx)])
除非您的基本阵列非常大,否则这不应该成为瓶颈
如果您有不同的问题约束(即,在每种情况下都有相同大小的切片),则可能会提出一种基于奇特索引的更快矢量化解决方案。例如,如果每个切片的大小为2(如上面的示例所示),则可以使用类似这样的奇特索引来获得相同的结果:
i, j = up_idx.T[:, :, None] + np.arange(2)
result = base[i[:, :, None], j[:, None]]
理解这种奇特的索引的关键是要认识到结果遵循索引数组的广播形状。?形状?哦,很抱歉。我在发布前更改了变量,显然错过了。谢谢你的回复。我应该提到的子阵列将保证相同的大小。将它们放在单个numpy数组中是我已经矢量化的下一段代码的一个要求。None对切片有什么作用?
None
在切片中为切片添加一个新的轴。