我正在寻找一种有效的方法来将指标设置为从零到已知数字(每行不同)。
例如
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的所有行。
答案 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]])