基于第二个数组的元素选择numpy数组的元素

基于第二个数组的元素选择numpy数组的元素,numpy,matrix,Numpy,Matrix,考虑一个形状为(7,6)的numpy数组 与包含从中心点a(3,2)=0开始的a半径的相同形状的第二个numpy阵列r一起: 我想选取位于r位置1的A的所有元素,即[9,10,11,15,4,6,5,13],位于r位置2的A的所有元素,依此类推。我知道有什么numpy函数可以做到这一点吗? 谢谢我得到的答案与您期望的答案不同(3不是第四行的4),顺序略有不同(严格来说是行,然后是列),但是: 或者,您可以通过转置两个数组来获得列顺序,然后是行顺序: >>> A.T[r.T==1

考虑一个形状为(7,6)的numpy数组

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

我想选取位于r位置1的A的所有元素,即[9,10,11,15,4,6,5,13],位于r位置2的A的所有元素,依此类推。我知道有什么numpy函数可以做到这一点吗?
谢谢

我得到的答案与您期望的答案不同(
3
不是第四行的
4
),顺序略有不同(严格来说是行,然后是列),但是:

或者,您可以通过转置两个数组来获得列顺序,然后是行顺序:

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

您可以通过执行类似于
a[r==1]
的操作来选择
a
的一部分,以将所有部分作为列表,您可以对范围(r.max()+1)内的i执行
[a[r==i]
。这将起作用,但可能效率低下,这取决于
r
中的值的大小,因为您需要为每个
i
计算
r==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

谢谢。。应该是这样的,对于r==1,它是3而不是4!对于更大的数组,是否可以循环它以获得更多的输出数组,即对于r=1、r=2、r=3……等等?@diegus是的,当然,您可以循环这些值并为每个值创建
A[r==n]
。为各种方法添加预期的输出可能会有所帮助。
>>> 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])
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