我是numpy的新手,我很难理解如何从np.array中提取具有定义的列和行的子矩阵:
numpy
np.array
Y = np.arange(16).reshape(4,4)
字符串如果我想提取列/行0和3,我应该有:
[[0 3] [12 15]]
型我尝试了所有的重塑功能.但不知道如何做到这一点。任何想法?
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。
NumPy
cdmah0mi2#
print y[0:4:3,0:4:3]
字符串是最短最合适的解决方法
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])
Y
Y[[0,3],:]
Y[:,[0,3]]
Y[[0,3],:][:,[0,3]]
Y[[0,3],[0,3]]
[Y[0,0], Y[3,3]]
array([ 0, 15])
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),:],然后索引到它。
Y[(0,3),:]
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]]
型
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构建器:
np.ix_((1,3), (0,3))
[[1],[3]],[0, 3]
>>> Y[[[1],[3]],[0, 3]] >>> array([[3, 3], >>> [2, 2]])
9rnv2umw7#
给予np.ix_一个尝试:
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]])
7条答案
按热度按时间laawzig21#
一个解决方案是通过切片/跨步来索引行/列。这里有一个例子,你从第一列到最后一列(即第一列和第四列)提取每三列/行。
字符串
这将为您提供所需的输出。
有关更多信息,请查看this page on indexing in
NumPy
。cdmah0mi2#
字符串
是最短最合适的解决方法
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])
xzlaal3s4#
您还可以使用以下命令执行此操作:
字符串
这相当于使用索引数组:
型
为了使广播按预期工作,你需要索引数组的非单例维度与你索引的轴对齐,例如对于一个n x m的2D子数组:
型
这不会创建一个中间数组,不像CT Zhu的答案,它创建中间数组
Y[(0,3),:]
,然后索引到它。dgiusagp5#
这也可以通过slice:
Y[[0,3],:][:,[0,3]]
来完成。更优雅的是,可以通过给定的行、列、页等索引集来对数组进行切片(甚至重新排序):字符串
重新排序试试这个:
型
tsm1rwdh6#
提取子矩阵可以使用两种方法,这已经在现有的答案中提出。这里是使用这个矩阵的总结:
字符串
1.您的子矩阵是原始矩阵的连续矩形区域,然后使用常规范围索引。例如,提取第3,4行和第2,3行交叉处的区域:
x1c 0d1x的数据
型
1.你的子矩阵不是一个连续的区域,这个区域中的一些行和/或列已经被删除,那么你必须建立一个有效单元格的网格,并将其用作掩码。幸运的是,这是numpy:ix_的目的,例如提取行1,3和列0,3的交集:
的
型
注意
np.ix_((1,3), (0,3))
严格等价于[[1],[3]],[0, 3]
,所以你可以直接使用它而不用调用meshgrid构建器:型
9rnv2umw7#
给予
np.ix_
一个尝试:字符串
这将返回您想要的结果:
型