Python 检查2d数组中每一行的不同列索引的2d数组值

Python 检查2d数组中每一行的不同列索引的2d数组值,python,arrays,numpy,multidimensional-array,Python,Arrays,Numpy,Multidimensional Array,我有一些二进制2D numpy数组(prediction),比如: 2D数组中的每一行都将句子分类为特定类别,2D数组中的每一列都对应于该句子的类别分类。例如,类别(categoriesarray)是['A'、'B'、'C'、'D'、'E'、'F'] 我还有另一个2D数组(catIndex),它包含每行中要检查的值的索引,例如 [[0], [4], [5], [2] ] 对于上述4个实例 我现在要做的是循环遍历二进制2D数组,对于为每个句子指定的列索引,检查它是1还是0,然后将相

我有一些二进制2D numpy数组(
prediction
),比如:

2D数组中的每一行都将句子分类为特定类别,2D数组中的每一列都对应于该句子的类别分类。例如,类别(
categories
array)是
['A'、'B'、'C'、'D'、'E'、'F']

我还有另一个2D数组(
catIndex
),它包含每行中要检查的值的索引,例如

[[0],
  [4],
  [5],
  [2]
] 
对于上述4个实例

我现在要做的是循环遍历二进制2D数组,对于为每个句子指定的列索引,检查它是
1
还是
0
,然后将相应的类别附加到新数组中(
catResult=[]
)。如果它是
0
,我会将
“no_region”
附加到新数组中

例如,在句子1中,我查看句子的索引
0
,检查它是
0
还是
1
。它是一个
1
,因此我将
'a'
附加到我的新数组中。在句子2中,我查看了句子的索引
4
,发现它是一个
0
,所以我在数组中添加了
“no_region”

当前代码:

for index in catIndex:
        for i,sentence in enumerate(prediction):
            for j,binaryLabel in enumerate(sentence):
                if prediction[i][index]==1:
                    catResult.append(categories[index])
                else:
                    catResult.append("no_region")

沿着这些思路进行的一些工作应该能够有效地完成,尽管目前还无法进行测试:

rows = len(prediction)
p = prediction[np.arange(rows), catIndex.flatten()]
catResult = np.empty(rows, 'S1').fill('n')
catResult[p] = categories[catIndex.flatten()][p]
创建二维阵列:

In [54]: M=[[1,0,1,0,1,1],[0,0,1,0,0,1],[1,1,1,1,1,0],[1,1,0,0,1,1]]
In [55]: M=np.array(M)
带有
ind
的列索引,行索引为[0,1,2,3]:

In [56]: ind=[0,4,5,2]    
In [57]: m=M[np.arange(len(ind)),ind]
In [58]: m
Out[58]: array([1, 0, 0, 0])
带有
ind
的地图标签:

In [59]: lbl=np.array(list('ABCDEF'),dtype=object)    
In [60]: res=lbl[ind]
In [61]: res
Out[61]: array(['A', 'E', 'F', 'C'], dtype=object)
使用
where
确定是使用该映射值,还是使用一些
None
。使用
对象
dtype可以轻松地用其他内容替换字符串标签、
无区域

In [62]: np.where(m, res, None)
Out[62]: array(['A', None, None, None], dtype=object)

这是一个很好的逻辑答案,有一点是我刚刚将问题中的ind转换成了
np.array(ind.ravel()
,但在其他方面,这是一个完美的答案。
In [62]: np.where(m, res, None)
Out[62]: array(['A', None, None, None], dtype=object)