基于第二个数组的元素选择numpy数组的元素
考虑一个形状为(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函数可以做到这一点吗?基于第二个数组的元素选择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
谢谢我得到的答案与您期望的答案不同(
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