numpy.ndarray类型20×20矩阵调用np.matrix.argmin报错,求正确获取argmin的方法
嘿,你这个问题其实是踩了numpy里两种矩阵类型的小坑啦!你的变量d明明是numpy.ndarray类型,但你却调用了np.matrix.argmin()这个专门给numpy.matrix类用的方法,这就导致了那个奇怪的AttributeError。
为啥会报错呢?简单说,np.matrix.argmin()内部会先调用普通ndarray的argmin()得到一个整数结果,但它还想给这个结果加个_align()方法来适配矩阵的返回格式,可普通的numpy.int64数值根本没这个方法,自然就崩了。
给你几个正确的解决办法,按需选就行:
直接获取扁平化的最小值索引
因为你的d是ndarray,直接用它自带的argmin()方法就好:min_index = d.argmin()这个返回的是把20×20矩阵拉成1维数组后,最小值所在的位置。比如最小值在第1行第2列(索引从0开始),那结果就是
1*20 + 2 = 22。获取二维坐标(行+列)
如果想知道最小值具体在第几行第几列,可以用np.unravel_index()把扁平化索引转成二维坐标:flat_idx = d.argmin() row, col = np.unravel_index(flat_idx, d.shape)这样
row就是行索引,col就是列索引,一目了然。按行/列分别求最小值索引
如果需要每一列的最小值所在行,或者每一行的最小值所在列,可以指定axis参数:- 求每列的最小值行索引:
d.argmin(axis=0),返回长度为20的数组 - 求每行的最小值列索引:
d.argmin(axis=1),同样返回长度为20的数组
- 求每列的最小值行索引:
另外提一句,你说原本是用np.matrix保存结果,但实际d是ndarray,大概率是在和pytorch交互的过程中自动转成了ndarray(pytorch的tensor转numpy默认就是ndarray),所以直接用ndarray的方法完全没问题,不用再去碰matrix类的方法啦。
备注:内容来源于stack exchange,提问作者Ali.A

