考虑形状(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功能吗? 谢谢
答案 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])