Python的numpy选择特定行列的方法
numpy选择特定行列
有时需要抽取矩阵中特定行的特定列。
比如,需要抽取矩阵x的0,1行的0,3列,结果为矩阵域
x = np.array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]]) y =android np.array([[ 0, 3], [ 4, 7]])
错误做法:第一反应这样写x[[0,1],[0,3]],然而得到的结果为
y Out[22]: array([0, 7])
其实这种写法是抽去了[0,0],[1,3]两个位置的数。numpy的所有维度的坐标个数应该相等,且互相是配对的。
Numpy数组的整数数组索引,返回数据副本,而不是创建视图。相比切片索引,整数数组的索引更具有通用性,因为其不要求索引值具有特定规律。
整数数组索引要点如下:
- 对于索引数组中未建立索引的维度(索引数组中的索引集数目小于被索引数组维度),默认被全部索引;
- 索引结果数组的形状由索引数组的形状与被索引数组中所有未索引的维的形状串联组成,也就是说,若对数组的所有维度建立索引,则索引数组的形状等于结果数组的形状;
- 若索引数组具有匹配的形状,即索引数组个数(索引集数)等于被索引数组的维度,此时结果数组与索引数组具有相同形状,且这些结果值对应于各维索引集的索引在索引数组中的位置;
正确的做法有以下几种:
1、先抽取行,再抽取列
x[[0,1]][:,[0,3]] Out[31]: array([[0, 3], 编程客栈 [4, 7]])
2、由于结果数组与索引数组具有相同形状,且这些结果值对应于各维索引集的索引在索引数组中的位置,因此可以直接写目标数据的坐标
index = [[[0,0],[1,1]],[[0,3],[0,3]]] x[index] Out[33]: array([[0, 3], [4, 7]])
此种做法也可以利用numpy的广播机制,写为
x[[0,1],[[0],[3]]] Out[39]: array([[0, 4], [3, 7]])
注意与开始的错误写法对比
3、Numpy提供的函数 ix_() 更快地实现索引指定行列
ix_(*args) Construct an open mesh from multiple sequences. This function takes N 1-D sequences and returns N outputs with N dimensions each, such that the shapepython is 1 in all but one dimension and the dimension with the non-unit shape value cycles through all N dimensions. Using `ix_` opythonne can quickly construct index arrays that will index the cross product. ``a[np.ix_([1,3],[2,5])]`` returns the array ``[[a[1,2] a[1,5]], [a[3,2] a[3,5]]]``.
写法为:
i,j = np.ix_([0,1android],[0,3]) x[i,j] Out[44]: array([[0, 3], [4, 7]])
到此这篇关于python的numpy选择特定行列的方法的文章就介绍到这了,更多相关numpy选择特定行列内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论