我是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
在第一种情况下,我有完整矩阵的总和,在第二种情况下,我有第一行的总和(而不是第二行)
我不明白为什么会出现这种行为
答案 0 :(得分:1)
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
对应b
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
构建新数组,甚至是2d。对于任性的MATLAB用户来说,np.matrix
是一种便利,并且经常会让新的numpy
用户感到困惑。