繁体   English   中英

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

[英]numpy: extract multiple subarrays of a position array in an efficient way

我有一个尺寸为行x col的2D系数数组COEFF和尺寸为nx 2的位置数组POS。

目标是创建大小为nx(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阵列。

谢谢!

我不知道以这种方式混合高级索引和切片的完全令人满意的解决方案。 但是以下情况是可以接受的(假设“平行”是指“向量化”):

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]]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM