[英]Slicing/Indexing with multidimensional arrays using Numpy
我使用以下方法创建了3个4x4数组(矩阵): arr=np.linspace(1,48,48).reshape(3,4,4)
矩阵如下所示:
[[[ 1. 2. 3. 4.]
[ 5. 6. 7. 8.]
[ 9. 10. 11. 12.]
[13. 14. 15. 16.]]
[[17. 18. 19. 20.]
[21. 22. 23. 24.]
[25. 26. 27. 28.]
[29. 30. 31. 32.]]
[[33. 34. 35. 36.]
[37. 38. 39. 40.]
[41. 42. 43. 44.]
[45. 46. 47. 48.]]]`
我想执行索引/拼接以获得某些输出,例如:
[[36. 35.] [40. 39.] [44. 43.] [48. 47.]]
[[13. 9. 5. 1.] [29. 25. 21. 17.] [45. 41. 37. 33.]]
[[25. 26. 27. 28.], [29. 30. 31. 32.], [33. 34. 35. 36.], [37. 38. 39. 40.]]
4*. [[1. 4.] [45. 48.]]
我正在努力解决该问题。 当使用特定矩阵时,我尝试访问该矩阵,然后从那里进行拼接/索引。 例如,输出[[36。 35.] [40。 39.] [44。 43.] [48。 47.]位于第三矩阵中。 我像这样访问矩阵matrix3 = arr[array([2])]
现在,我只处理第三个矩阵中的行和列,发现很难正确切片。 matrix3[::-1,::-1]
反转列和行吗? 如果是,那么这是最好的方法吗? 相反,我应该使用重整形,还是应该在所有3个4x4阵列上使用重整形,还是应该访问要使用的矩阵然后进行重整?
编辑:增加了4。
逐步提取您的第一个结果:
In [53]: arr[2,:,:] # the desired plane
Out[53]:
array([[33, 34, 35, 36],
[37, 38, 39, 40],
[41, 42, 43, 44],
[45, 46, 47, 48]])
In [54]: arr[2,:,2:] # the desired columns
Out[54]:
array([[35, 36],
[39, 40],
[43, 44],
[47, 48]])
In [55]: arr[2,:,:1:-1] # the reversed order
Out[55]:
array([[36, 35],
[40, 39],
[44, 43],
[48, 47]])
或者,如果更容易,请作为一个单独的步骤反向操作:
In [56]: arr[2,:,2:][:,::-1]
Out[56]:
array([[36, 35],
[40, 39],
[44, 43],
[48, 47]])
In [57]: arr[:,:,0] # select column
Out[57]:
array([[ 1, 5, 9, 13],
[17, 21, 25, 29],
[33, 37, 41, 45]])
In [58]: arr[:,::-1,0] # reverse
Out[58]:
array([[13, 9, 5, 1],
[29, 25, 21, 17],
[45, 41, 37, 33]])
In [59]: arr[:,::-1,0].T # transpose
Out[59]:
array([[13, 29, 45],
[ 9, 25, 41],
[ 5, 21, 37],
[ 1, 17, 33]])
这有点棘手。 我们想要一个平面的最后两行,而另一平面想要前两行。 为了得到这个,我们需要一对将广播到正确形状的索引,将1
与[2,3]
等配对。
In [61]: arr[[[1],[2]],[[2,3],[0,1]],:]
Out[61]:
array([[[25, 26, 27, 28],
[29, 30, 31, 32]],
[[33, 34, 35, 36],
[37, 38, 39, 40]]])
这是一个3D矩阵; 将其缩减为2d的一种方法是串联:
In [63]: np.concatenate(arr[[[1],[2]],[[2,3],[0,1]],:],axis=0)
Out[63]:
array([[25, 26, 27, 28],
[29, 30, 31, 32],
[33, 34, 35, 36],
[37, 38, 39, 40]])
重塑效果也一样:
In [65]: arr[[[1],[2]],[[2,3],[0,1]],:].reshape(4,4)
Out[65]:
array([[25, 26, 27, 28],
[29, 30, 31, 32],
[33, 34, 35, 36],
[37, 38, 39, 40]])
也是arr.reshape(3,2,2,4)[[1,2],[1,0],:].reshape(4,4)
您可以将这些索引表达式写成带有切片的元组,例如:
In [66]: idx = (2, slice(None), slice(None,1,-1))
In [67]: arr[idx]
Out[67]:
array([[36, 35],
[40, 39],
[44, 43],
[48, 47]])
因此,通常,常用工具包括索引(带有切片,标量和列表),反转(-1步),转置(或交换轴)和重塑。 您不能仅凭其中之一做所有事情。
切片使您走在正确的轨道上! 为获得所需的输出,请尝试:
arr[2,:,:1:-1]
np.vstack((arr[i, ::-1, 0] for i in range(3)))
np.vstack((arr[1, 2:, :], arr[2, :2, :]))
输出:
array([[36., 35.],
[40., 39.],
[44., 43.],
[48., 47.]])
array([[13., 9., 5., 1.],
[29., 25., 21., 17.],
[45., 41., 37., 33.]])
array([[25., 26., 27., 28.],
[29., 30., 31., 32.],
[33., 34., 35., 36.],
[37., 38., 39., 40.]])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.