获取数组中值第一次出现的列



我们有以下numpy数组:

b = np.array([[0.3, -0.2, 0.4, 0.5, -0.8, 1.0, 0.0, 0.0],
[0.6, 0.2, 0.7, 0.91, 0.67, 0.0, 1.0, 0.0],
[0.5, 0.1, 0.7, 0.0, 0.6, 0.0, 0.0, 1.0]])

我们可以在这里看到,在这个数组的右侧(最后3列(,我们有一个对角矩阵。如何获得1在这个对角矩阵中首次出现的列?即CCD_ 2。我尝试了以下方法,给出了正确的答案:

first_occurence = np.argmax(b == 1, axis=1)[0]

但是,如果我们有下面的数组,这不起作用,给我0作为答案(应该是6(

b = np.array([[0.3, -0.2, 0.4, 0.5, -0.8, 0.0, 0.0, 0.0],
[0.6, 0.2, 0.7, 0.91, 0.67, 0.0, 1.0, 0.0],
[0.5, 0.1, 0.7, 0.0, 0.6, 0.0, 0.0, 1.0]])

您可以这样做:

firsts = np.argmax(b == 1, axis=1)
first_occurence = min(firsts[firsts != 0])

min()firsts[firsts != 0]参数筛选出b不包含1的行,然后min()查找要查找的列。

更新:

基于OP澄清的假设:

  • 输入包含子矩阵,该子矩阵是输入矩阵b1b.shape[0]之间阶的单位矩阵
  • 这个单位矩阵的最右边的列是在输入矩阵的最左边的列中找到的
  • 该单位矩阵的顶行在CCD_ 13和CCD_

以下是一种识别输入矩阵中包含嵌入单位矩阵中最左边列的列的方法:

def foo(b):
rows = b.shape[0]
left = b.shape[1] - rows
for tops in range(rows):
order = rows - tops
eye = np.eye(order)
for top in range(tops + 1):
if np.allclose(b[top:top + order, left:left + order], eye):
return left
left += 1

测试代码:

b1 = np.array([
[0.3, -0.2, 0.4, 0.5, -0.8,  1.0, 0.0, 0.0],
[0.6,  0.2, 0.7, 0.91, 0.67, 0.0, 1.0, 0.0],
[0.5,  0.1, 0.7, 0.0,  0.6,  0.0, 0.0, 1.0]])
b2 = np.array([
[0.3, -0.2, 0.4, 0.5, -0.8,  0.0, 0.0, 0.0],
[0.6,  0.2, 0.7, 0.91, 0.67, 0.0, 1.0, 0.0],
[0.5,  0.1, 0.7, 0.0,  0.6,  0.0, 0.0, 1.0]])
b3 = np.array([
[0,   -0.2, 0.4, 0.5, -0.8,  1.0, 0.0, 0.0],
[0.6, 1,    0.7, 0.91, 0.67, 0.0, 1.0, 0.0],
[0.5, 0.1,  0.7, 0.0,  0.6,  0.0, 0.0, 1.0]])
b4 = np.array([
[0.3, -0.2, 0.4, 0.5, -0.8,  0.0, 1.0, 0.0],
[0.6, 0.2,  0.7, 0.91, 0.67, 0.0, 0.0, 1.0],
[0.5, 0.1,  0.7, 0.0,  0.6,  0.0, 0.0, 1.0]])
print( foo(b1) )
print( foo(b2) )
print( foo(b3) )
print( foo(b4) )

输出:

5
6
5
6

最新更新