关于python矩阵逻辑索引

时间:2017-07-22 15:14:22

标签: python numpy matrix indexing

我是python中的新手,我不理解以下代码; 我期望test1和test2给我相同的结果(8,第二行的总和),而不是

a=np.matrix([[1,2,3],[1,3, 4]])
b=np.matrix([[0,1]])
print(np.where(b==1))
test1=a[np.nonzero(b==1),:]
print(test1.sum())
ind,_=np.nonzero(b==1);  #found in a code that I'm trying to undestand (why the _ ?)

test2=a[ind,:]
print(test2.sum())

给了我

 (array([0]), array([1]))
 14
 6

在第一种情况下,我有完整矩阵的总和,在第二种情况下,我有第一行的总和(而不是第二行)

我不明白为什么会出现这种行为

1 个答案:

答案 0 :(得分:1)

In [869]: a
Out[869]: 
matrix([[1, 2, 3],
        [1, 3, 4]])
In [870]: b
Out[870]: matrix([[0, 1]])

在此使用中,wherenonzero相同:

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)

选择wherea返回(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对应b

第2列的第2列
In [881]: a[:,np.where(b==1)[1]]
Out[881]: 
matrix([[2],
        [3]])

由于abnp.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构建新数组,甚至是2d。对于任性的MATLAB用户来说,np.matrix是一种便利,并且经常会让新的numpy用户感到困惑。