jth*_*jth 2 python arrays numpy multidimensional-array
A并且B是Numpy阵列的常见形状[n1,n2,n3].值的B全部是整数[0,n3).我希望A"反转" B在每个值的意义上A满足A[i,j,B[i,j,k]]=k所有i,j,k适当范围.用for循环做这个是多么明显,但我怀疑有一个聪明的单行使用花式索引.有人看到了吗?
这有两种方法.
第一种方法是单线: A = B.argsort(axis=-1)
这是一个例子. B具有形状(3,5,7)和用于每个固定i和j,B[i,j,:]是的置换range(B.shape[2]).
In [386]: B
Out[386]:
array([[[1, 5, 4, 6, 2, 3, 0],
[6, 5, 3, 4, 2, 1, 0],
[4, 5, 0, 3, 1, 2, 6],
[0, 5, 6, 3, 2, 1, 4],
[4, 1, 5, 2, 6, 3, 0]],
[[2, 6, 0, 1, 5, 4, 3],
[3, 2, 4, 0, 1, 5, 6],
[3, 4, 6, 5, 1, 2, 0],
[4, 6, 3, 0, 2, 5, 1],
[0, 3, 1, 6, 4, 5, 2]],
[[0, 3, 6, 2, 1, 5, 4],
[3, 1, 2, 4, 6, 0, 5],
[1, 3, 5, 6, 4, 0, 2],
[4, 1, 6, 0, 2, 3, 5],
[6, 4, 5, 1, 0, 3, 2]]])
In [387]: A = B.argsort(axis=-1)
In [388]: A
Out[388]:
array([[[6, 0, 4, 5, 2, 1, 3],
[6, 5, 4, 2, 3, 1, 0],
[2, 4, 5, 3, 0, 1, 6],
[0, 5, 4, 3, 6, 1, 2],
[6, 1, 3, 5, 0, 2, 4]],
[[2, 3, 0, 6, 5, 4, 1],
[3, 4, 1, 0, 2, 5, 6],
[6, 4, 5, 0, 1, 3, 2],
[3, 6, 4, 2, 0, 5, 1],
[0, 2, 6, 1, 4, 5, 3]],
[[0, 4, 3, 1, 6, 5, 2],
[5, 1, 2, 0, 3, 6, 4],
[5, 0, 6, 1, 4, 2, 3],
[3, 1, 4, 5, 0, 6, 2],
[4, 3, 6, 5, 1, 2, 0]]])
Run Code Online (Sandbox Code Playgroud)
通过采样几个值来验证所需的属性.
In [389]: A[0, 0, B[0, 0, 0]]
Out[389]: 0
In [390]: A[0, 0, B[0, 0, 1]]
Out[390]: 1
In [391]: A[0, 0, B[0, 0, :]]
Out[391]: array([0, 1, 2, 3, 4, 5, 6])
In [392]: A[2, 3, B[2, 3, :]]
Out[392]: array([0, 1, 2, 3, 4, 5, 6])
Run Code Online (Sandbox Code Playgroud)
第二种方法比使用时间复杂度低argsort,但它是三线而不是一线.我将使用与B上面相同的内容.
创建A,但尚未分配任何值.
In [393]: A = np.empty_like(B)
Run Code Online (Sandbox Code Playgroud)
为每个维度创建索引数组B.
In [394]: i, j, k = np.ogrid[[slice(n) for n in B.shape]] # or np.ix_(*[range(n) for n in B.shape])
Run Code Online (Sandbox Code Playgroud)
这是很酷的部分.完全按照你在问题中写的那样完成作业.
In [395]: A[i, j, B[i, j, k]] = k
Run Code Online (Sandbox Code Playgroud)
验证我们是否与A上述相同.
In [396]: A
Out[396]:
array([[[6, 0, 4, 5, 2, 1, 3],
[6, 5, 4, 2, 3, 1, 0],
[2, 4, 5, 3, 0, 1, 6],
[0, 5, 4, 3, 6, 1, 2],
[6, 1, 3, 5, 0, 2, 4]],
[[2, 3, 0, 6, 5, 4, 1],
[3, 4, 1, 0, 2, 5, 6],
[6, 4, 5, 0, 1, 3, 2],
[3, 6, 4, 2, 0, 5, 1],
[0, 2, 6, 1, 4, 5, 3]],
[[0, 4, 3, 1, 6, 5, 2],
[5, 1, 2, 0, 3, 6, 4],
[5, 0, 6, 1, 4, 2, 3],
[3, 1, 4, 5, 0, 6, 2],
[4, 3, 6, 5, 1, 2, 0]]])
Run Code Online (Sandbox Code Playgroud)
在对SO进行了更多讨论后,我发现这两种方法都出现在"如何在numpy中反转置换数组"这一问题的答案中.这里唯一真正新的是沿着三维阵列的一个轴进行反演.
| 归档时间: |
|
| 查看次数: |
141 次 |
| 最近记录: |