Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取与numpy中混淆矩阵中每种类型错误的实例对应的索引_Python_Arrays_Numpy_Matrix - Fatal编程技术网

Python 获取与numpy中混淆矩阵中每种类型错误的实例对应的索引

Python 获取与numpy中混淆矩阵中每种类型错误的实例对应的索引,python,arrays,numpy,matrix,Python,Arrays,Numpy,Matrix,我希望能够获得犯下特定类型错误的实例的索引(或数组掩码),而不仅仅是获取混淆矩阵。例如,我希望看到当它属于类0时,预测为类2的实例,等等 我可以使用列表理解轻松获得数组掩码: import numpy as np y_true, y_pred = np.array([0, 1, 0, 2, 1, 1]), np.array([0, 0, 0, 2, 1, 2]) np.array([[np.logical_and(y_true==r, y_pred==c) for c in xrange(3)

我希望能够获得犯下特定类型错误的实例的索引(或数组掩码),而不仅仅是获取混淆矩阵。例如,我希望看到当它属于类0时,预测为类2的实例,等等

我可以使用列表理解轻松获得数组掩码:

import numpy as np

y_true, y_pred = np.array([0, 1, 0, 2, 1, 1]), np.array([0, 0, 0, 2, 1, 2])
np.array([[np.logical_and(y_true==r, y_pred==c) for c in xrange(3)] for r in xrange(3)])
这就产生了:

[[[ True False  True False False False]
  [False False False False False False]
  [False False False False False False]]

 [[False  True False False False False]
  [False False False False  True False]
  [False False False False False  True]]

 [[False False False False False False]
  [False False False False False False]
  [False False False  True False False]]]
(要获取索引,我可以使用
np.where()
)。上述内容对应于混淆矩阵:

[[2 0 0]
 [1 1 1]
 [0 0 1]]
但是,我想问一下,是否有一个
numpy
-thonic一行程序可以帮助我消除嵌套列表理解?

不是一行程序:

In [42]: y_true = np.array([0, 1, 0, 2, 1, 1])

In [43]: y_pred = np.array([0, 0, 0, 2, 1, 2])

In [44]: n = len(y_pred)

In [45]: values = np.arange(3).reshape(-1,1)

In [46]: np.logical_and((y_true == values).reshape(-1,1,n), (y_pred == values).reshape(1,-1,n))
Out[46]: 
array([[[ True, False,  True, False, False, False],
        [False, False, False, False, False, False],
        [False, False, False, False, False, False]],

       [[False,  True, False, False, False, False],
        [False, False, False, False,  True, False],
        [False, False, False, False, False,  True]],

       [[False, False, False, False, False, False],
        [False, False, False, False, False, False],
        [False, False, False,  True, False, False]]], dtype=bool)
对同一表达式的一种略为简短的拼写:

In [100]: (y_true == values).reshape(-1,1,n) & (y_pred == values)
Out[100]: 
array([[[ True, False,  True, False, False, False],
        [False, False, False, False, False, False],
        [False, False, False, False, False, False]],

       [[False,  True, False, False, False, False],
        [False, False, False, False,  True, False],
        [False, False, False, False, False,  True]],

       [[False, False, False, False, False, False],
        [False, False, False, False, False, False],
        [False, False, False,  True, False, False]]], dtype=bool)

要在混合中添加这些令人困惑的奇特索引解决方案之一,您还可以执行以下操作:

>>> y_true = np.array([0, 1, 0, 2, 1, 1])
>>> y_pred = np.array([0, 0, 0, 2, 1, 2])
>>> out = np.zeros((3, 3, len(y_true)), dtype=np.bool)
>>> out[y_true, y_pred, np.arange(len(y_true))] = True
>>> out
array([[[ True, False,  True, False, False, False],
        [False, False, False, False, False, False],
        [False, False, False, False, False, False]],

       [[False,  True, False, False, False, False],
        [False, False, False, False,  True, False],
        [False, False, False, False, False,  True]],

       [[False, False, False, False, False, False],
        [False, False, False, False, False, False],
        [False, False, False,  True, False, False]]], dtype=bool)

您可以通过上一个轴将上述矩阵求和得到混淆矩阵,但如果这就是您想要的,则最好直接使用
np.bincount

>>> np.bincount(y_pred + 3*y_true, minlength=9).reshape(3,3)
array([[2, 0, 0],
       [1, 1, 1],
       [0, 0, 1]], dtype=int64)
SciPy的
sparse_coo
矩阵将重复索引相加,因此以下方法也适用:

>>> sps.coo_matrix((np.ones_like(y_true, dtype=np.intp),
---                 (y_true, y_pred)), shape=(3, 3)).A
array([[2, 0, 0],
       [1, 1, 1],
       [0, 0, 1]], dtype=int64)

我对接受哪个答案感到非常矛盾。我喜欢这样,因为它清晰直观,但我问这个问题是希望有人能提供一个@Jaime已经完成的高级索引解决方案。谢谢你的帮助:)不必自相矛盾,@Jaime的回答非常巧妙。我一直在考虑是否可以使用(
coo_矩阵((数据,(I,j)),[shape=(M,N)]
中定义的最后一组参数将其应用于
coo_矩阵的初始化,但所有这些数组索引都伤害了我的大脑。你有什么想法吗?看我的编辑,我想我们已经爱上了,有比创建布尔数组更好的选项来构建混淆矩阵。是的,这或多或少与此相同,但我确实需要与混淆矩阵中每个条目对应的数组掩码或索引。