设置指标以每行索引为单位

时间:2019-06-04 13:37:19

标签: python numpy

我正在寻找一种有效的方法来将指标设置为从零到已知数字(每行不同)。

例如

 a =
 array([[1, 1, 1, 0, 0, 0, 0, 0, 0],
        [1, 0, 0, 0, 0, 0, 0, 0, 0],
        [1, 1, 1, 1, 1, 1, 0, 0, 0],
        [1, 1, 0, 0, 0, 0, 0, 0, 0],
        [1, 1, 1, 1, 1, 1, 1, 1, 0]])

我知道当a从1变为零时带有索引的向量。

b = [3, 1, 6, 2, 8]

我想知道是否有一种快速的方法来设置这些指标,而不是使用for循环填充a的所有行。

3 个答案:

答案 0 :(得分:1)

b和远程数组上使用outer-comparison-

In [16]: ncols = 9

In [17]: b
Out[17]: [3, 1, 6, 2, 8]

In [19]: np.greater.outer(b,np.arange(ncols)).view('i1')
Out[19]: 
array([[1, 1, 1, 0, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1, 1, 0, 0, 0],
       [1, 1, 0, 0, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1, 1, 1, 1, 0]], dtype=int8)

其他类似的表达方式-

(np.asarray(b)[:,None] > np.arange(ncols)).view('i1')
(np.asarray(b)[:,None] > np.arange(ncols)).astype(int)

b作为数组,可以进一步简化,因为我们可以跳过使用np.asarray(b)的数组转换。

答案 1 :(得分:1)

我能想到的最简单的方法是:

result=[]
for row in array:
    result.append(row.tolist().index(0))

print(result)

[3, 1, 6, 2, 8]

此方法起作用的原因是,该列表具有一个称为index的方法,该方法可告知列表中特定项目的首次出现。因此,我正在对该二维数组进行迭代,将每个数组转换为列表,并对每个数组使用0索引。

您可以将这些值存储到另一个列表中,然后为每一行添加到列表中。

答案 2 :(得分:0)

您可以使用广播进行外部比较:

b = np.asarray([3, 1, 6, 2, 8])

a = (np.arange(b.max() + 1) < b[:, None]).astype(int)
# array([[1, 1, 1, 0, 0, 0, 0, 0, 0],
#        [1, 0, 0, 0, 0, 0, 0, 0, 0],
#        [1, 1, 1, 1, 1, 1, 0, 0, 0],
#        [1, 1, 0, 0, 0, 0, 0, 0, 0],
#        [1, 1, 1, 1, 1, 1, 1, 1, 0]])