根据第二个数组的元素选择numpy数组的元素

时间:2014-08-22 15:17:11

标签: numpy matrix

考虑形状(7,6)的numpy数组A

A = array([[0, 1, 2, 3, 5, 8],
           [4, 100, 6, 7, 8, 7],
           [8, 9,  10,  11, 5, 4],
           [12, 13, 14, 15, 1, 2],
           [1, 3, 5, 6, 4, 8],
           [12, 23, 12, 24, 4, 3],
           [1, 3, 5, 7,  89, 0]])

与相同形状的第二个numpy数组r一起包含从中心点A(3,2)= 0开始的半径A:

 r = array([[3, 3, 3, 3, 3, 4],
            [2, 2, 2, 2, 2, 3],
            [2, 1, 1, 1, 2, 3],
            [2, 1, 0, 1, 2, 3],
            [2, 1, 1, 1, 2, 3],
            [2, 2, 2, 2, 2, 3],
            [3, 3, 3, 3, 3, 4]])

我想拿起A的所有元素,它们位于r的位置1,即[9,10,11,15,4,6,5,13],A的所有元素都位于r的位置2,依此类推。我有一些numpy功能吗? 谢谢

2 个答案:

答案 0 :(得分:1)

您可以通过执行A之类的操作来选择A[r == 1]的部分,以便将所有部分作为您可以执行的列表[A[r == i] for i in range(r.max() + 1)]。这可行,但可能效率低,具体取决于r中的值有多大,因为您需要为每个r == i计算i

您也可以使用此技巧,首先根据r对A进行排序,然后将排序后的A数组拆分到正确的位置。看起来像这样:

r_flat = r.ravel()
order = r_flat.argsort()
A_sorted = A.ravel()[order]
r_sorted = r_flat[order]
edges = r_sorted.searchsorted(np.arange(r_sorted[-1] + 1), 'right')

sections = []
start = 0
for end in edges:
    sections.append(A_sorted[start:end])
    start = end

答案 1 :(得分:0)

我得到了一个与你期望的答案不同的答案(3而非4来自第4行)并且顺序略有不同(严格的行然后是列),但是:

>>> A
array([[  0,   1,   2,   3,   5,   8],
       [  4, 100,   6,   7,   8,   7],
       [  8,   9,  10,  11,   5,   4],
       [ 12,  13,  14,  15,   1,   2],
       [  1,   3,   5,   6,   4,   8],
       [ 12,  23,  12,  24,   4,   3],
       [  1,   3,   5,   7,  89,   0]])
>>> r
array([[3, 3, 3, 3, 3, 4],
       [2, 2, 2, 2, 2, 3],
       [2, 1, 1, 1, 2, 3],
       [2, 1, 0, 1, 2, 3],
       [2, 1, 1, 1, 2, 3],
       [2, 2, 2, 2, 2, 3],
       [3, 3, 3, 3, 3, 4]])
>>> A[r==1]
array([ 9, 10, 11, 13, 15,  3,  5,  6])

或者,您可以通过转置两个数组来获取列然后排序:

>>> A.T[r.T==1]
array([ 9, 13,  3, 10,  5, 11, 15,  6])