python Numpy抽取子矩阵

8oomwypt  于 12个月前  发布在  Python
关注(0)|答案(7)|浏览(144)

我是numpy的新手,我很难理解如何从np.array中提取具有定义的列和行的子矩阵:

Y = np.arange(16).reshape(4,4)

字符串
如果我想提取列/行0和3,我应该有:

[[0 3]
 [12 15]]


我尝试了所有的重塑功能.但不知道如何做到这一点。任何想法?

laawzig2

laawzig21#

一个解决方案是通过切片/跨步来索引行/列。这里有一个例子,你从第一列到最后一列(即第一列和第四列)提取每三列/行。

In [1]: import numpy as np
In [2]: Y = np.arange(16).reshape(4, 4)
In [3]: Y[0:4:3, 0:4:3]
Out[1]: array([[ 0,  3],
               [12, 15]])

字符串
这将为您提供所需的输出。
有关更多信息,请查看this page on indexing in NumPy

cdmah0mi

cdmah0mi2#

print y[0:4:3,0:4:3]

字符串
是最短最合适的解决方法

b0zn9rqh

b0zn9rqh3#

首先,您的Y只有4个col和rows,所以没有col4或row4,最多是col3或row3。
若要获取0,3行:Y[[0,3],:]若要获取0,3行:Y[:,[0,3]]
因此,要获取您请求的数组:Y[[0,3],:][:,[0,3]]
请注意,如果您只使用Y[[0,3],[0,3]],则它等效于[Y[0,0], Y[3,3]],结果将包含两个元素:array([ 0, 15])

xzlaal3s

xzlaal3s4#

您还可以使用以下命令执行此操作:

Y[[[0],[3]],[0,3]]

字符串
这相当于使用索引数组:

idx = np.array((0,3)).reshape(2,1)
Y[idx,idx.T]


为了使广播按预期工作,你需要索引数组的非单例维度与你索引的轴对齐,例如对于一个n x m的2D子数组:

Y[<n x 1 array>,<1 x m array>]


这不会创建一个中间数组,不像CT Zhu的答案,它创建中间数组Y[(0,3),:],然后索引到它。

dgiusagp

dgiusagp5#

这也可以通过slice:Y[[0,3],:][:,[0,3]]来完成。更优雅的是,可以通过给定的行、列、页等索引集来对数组进行切片(甚至重新排序):

r=np.array([0,3])
c=np.array([0,3])
print(Y[r,:][:,c]) #>>[[ 0  3][12 15]]

字符串
重新排序试试这个:

r=np.array([0,3])
c=np.array([3,0])
print(Y[r,:][:,c])#>>[[ 3  0][15 12]]

tsm1rwdh

tsm1rwdh6#

提取子矩阵可以使用两种方法,这已经在现有的答案中提出。这里是使用这个矩阵的总结:

Y: array([[4, 1, 4, 3, 1],
          [3, 1, 2, 3, 1],
          [4, 3, 2, 2, 4],
          [2, 4, 3, 2, 3],
          [2, 1, 4, 4, 3]])

字符串
1.您的子矩阵是原始矩阵的连续矩形区域,然后使用常规范围索引。例如,提取第3,4行和第2,3行交叉处的区域:
x1c 0d1x的数据

>>> Y[3:, 2:4]
>>> array([[3, 2],
>>>        [4, 4]])


1.你的子矩阵不是一个连续的区域,这个区域中的一些行和/或列已经被删除,那么你必须建立一个有效单元格的网格,并将其用作掩码。幸运的是,这是numpy:ix_的目的,例如提取行1,3和列0,3的交集:


>>> np.ix_((1,3), (0,3))
>>> (array([[1],
>>>         [3]]),
>>>  array([[0, 3]]))
>>>
>>> Y[np.ix_((1,3), (0,3))]
>>> array([[3, 3],
>>>        [2, 2]])


注意np.ix_((1,3), (0,3))严格等价于[[1],[3]],[0, 3],所以你可以直接使用它而不用调用meshgrid构建器:

>>> Y[[[1],[3]],[0, 3]]
>>> array([[3, 3],
>>>        [2, 2]])

9rnv2umw

9rnv2umw7#

给予np.ix_一个尝试:

Y[np.ix_([0,3],[0,3])]

字符串
这将返回您想要的结果:

In [25]: Y = np.arange(16).reshape(4,4)
In [26]: Y[np.ix_([0,3],[0,3])]
Out[26]:
array([[ 0,  3],
       [12, 15]])

相关问题