In [869]: a
Out[869]:
matrix([[1, 2, 3],
[1, 3, 4]])
In [870]: b
Out[870]: matrix([[0, 1]])
在此使用where 与nonzero 相同:
In [871]: np.where(b==1)
Out[871]: (array([0], dtype=int32), array([1], dtype=int32))
In [872]: np.nonzero(b==1)
Out[872]: (array([0], dtype=int32), array([1], dtype=int32))
它给出一个元组,每个维度都有一个索引数组(np.matrix 为 2)。 ind,_= 只是解包这些数组,然后扔掉第二个。 _ 在交互式会话中重复使用,例如我正在使用的会话。
In [873]: ind,_ =np.nonzero(b==1)
In [874]: ind
Out[874]: array([0], dtype=int32)
使用where 选择会返回来自a 的(0,1) 值。但这就是你想要的吗?
In [875]: a[np.where(b==1)]
Out[875]: matrix([[2]])
添加: 确实索引整个数组,但增加了维度;再次可能不是我们想要的
In [876]: a[np.where(b==1),:]
Out[876]:
matrix([[[1, 2, 3]],
[[1, 3, 4]]])
ind 是单个索引数组,因此从a 中选择 0 的行。
In [877]: a[ind,:]
Out[877]: matrix([[1, 2, 3]])
In [878]:
但是b==1是否应该找到b的第二个元素,然后选择a的第二行?为此,我们必须使用来自where 的第二个索引数组:
In [878]: a[np.where(b==1)[1],:]
Out[878]: matrix([[1, 3, 4]])
或者a的第2列对应b的第2列
In [881]: a[:,np.where(b==1)[1]]
Out[881]:
matrix([[2],
[3]])
因为a和b是np.matrix,所以索引结果总是2d。
对于c 数组,where 生成单个元素元组
In [882]: c=np.array([0,1])
In [883]: np.where(c==1)
Out[883]: (array([1], dtype=int32),)
In [884]: a[_,:] # here _ is the last result, Out[883]
Out[884]: matrix([[1, 3, 4]])
我们通常建议使用np.array 来构造新数组,甚至是二维数组。 np.matrix 为任性的 MATLAB 用户提供了便利,却常常让 numpy 新用户感到困惑。