numpy:以有效的方式提取位置数组的多个子数组

时间:2017-03-27 15:34:43

标签: python arrays numpy indexing

我有一个2D系数数组COEFF,大小为行x col,位置数组POS大小为n x 2.

目标是创建一个大小为n x(2 * l)x(2 * l)的批处理数组BAT,其中l是子阵列的一半长度。

看起来像这样

BAT[i, :, :] = COEFF[POS[i, 1] - l:POS[i, 1] + l, POS[i, 0] - l:POS[i, 0] + l]

可以根据以上顺序代码生成BAT。但是,我想知道是否有一种有效的方法来并行构建BAT阵列。

谢谢!

1 个答案:

答案 0 :(得分:0)

我不知道以这种方式混合高级索引和切片的完全令人满意的解决方案。但以下内容可能是可以接受的(假设" parallel"你的意思是" vectorised"):

import numpy as np

nrow, ncol = 7, 7
n, l = 3, 2

coeff = np.random.randint(0,10, (nrow,ncol))
pos = np.c_[np.random.randint(l, nrow-l+1, (n,)),np.random.randint(l, ncol-l+1, (n,))]

i = (pos[:, :1] + np.arange(-l, l))[:, :, None]
j = (pos[:, 1:] + np.arange(-l, l))[:, None, :]

print(coeff, '\n')
print(pos, '\n')
print(coeff[i, j])

打印:

# [[7 6 7 6 3 9 9]
#  [3 6 8 3 4 8 6]
#  [3 7 4 7 4 6 8]
#  [0 7 2 3 7 0 4]
#  [8 5 2 0 0 1 7]
#  [4 6 1 9 4 5 4]
#  [1 6 8 3 4 5 0]] 

# [[2 2]
#  [3 2]
#  [2 4]] 

# [[[7 6 7 6]
#   [3 6 8 3]
#   [3 7 4 7]
#   [0 7 2 3]]

#  [[3 6 8 3]
#   [3 7 4 7]
#   [0 7 2 3]
#   [8 5 2 0]]

#  [[7 6 3 9]
#   [8 3 4 8]
#   [4 7 4 6]
#   [2 3 7 0]]]