繁体   English   中英

在python 2.7中查找矩阵中每一列等于或大于1时的行号

[英]Find row number when each column in a matrix is equal to or greater than 1 in python 2.7

我正在尝试编写一些代码,当“矩阵”中的每一列等于或大于一时,它会告诉我行号。 对于此代码,我必须使用 python 2.7。 以前我使用 numpy 解决了它(见下面的解释),但我必须实现它的软件不支持 numpy 或 python 3。

我有一个如下列表:

data = [0.9338022866253757, 0.9438022866253757, 0.9538022866253757, 0.9638022866253757, 0.9738022866253757, 0.9838022866253757,
0.9526111539604993, 0.9626111539604993, 0.9726111539604994, 0.9826111539604994, 0.9926111539604994, 1.0026111539604994,
0.9638333594112685, 0.9738333594112685, 0.9838333594112684, 0.9938333594112684, 1.0038333594112685, 1.0138333594112683,
0.9718956496941793, 0.9818956496941793, 0.9918956496941793, 1.0018956496941793, 1.0118956496941793, 1.0218956496941793,
0.9782070486192962, 0.9882070486192962, 0.9982070486192962, 1.0082070486192962, 1.0182070486192962, 1.0282070486192962]

这个列表应该被分成类似于矩阵的东西,我用下面的 function 做这个,并将它分成长度为 6 的另一个列表中的列表,如下所示:

def split(arr, size):
    arrs = []
    while len(arr) > size:
        pice = arr[:size]
        arrs.append(pice)
        arr = arr[size:]
    arrs.append(arr)
    return arrs

data_split = split(data,6)
print(data_split)

Output:

data_split = [[0.9338022866253757, 0.9438022866253757, 0.9538022866253757, 0.9638022866253757, 0.9738022866253757, 0.9838022866253757],
[0.9526111539604993, 0.9626111539604993, 0.9726111539604994, 0.9826111539604994, 0.9926111539604994, 1.0026111539604994],
[0.9638333594112685, 0.9738333594112685, 0.9838333594112684, 0.9938333594112684, 1.0038333594112685, 1.0138333594112683],
[0.9718956496941793, 0.9818956496941793, 0.9918956496941793, 1.0018956496941793, 1.0118956496941793, 1.0218956496941793],
[0.9782070486192962, 0.9882070486192962, 0.9982070486192962, 1.0082070486192962, 1.0182070486192962, 1.0282070486192962]]

这就是我卡住的地方,data_split 显然不是一个真正的矩阵,我无法弄清楚如何进行我想要的操作,以便我可以在每列中找到数字达到 1 或大于 1 的第一个条目。

结果应该是:

[0 0 0 3 2 1]

output说明:

第 0、1 和 2 列永远不会达到数字 1,因此结果为 0。第 3 列在第 3 行达到 1,第 4 列在第 2 行达到 1,最后一列在第 1 行达到 1。

在 Python 3

以前我使用 numpy 来解决这个问题,但我正在为其编写代码的程序不支持它。 numpy 的工作 Python 3 代码如下:

import numpy as np
data = np.array([0.93380229, 0.94380229, 0.95380229, 0.96380229, 0.97380229, 0.98380229,
 0.95261115, 0.96261115, 0.97261115, 0.98261115, 0.99261115, 1.00261115,
 0.96383336, 0.97383336, 0.98383336, 0.99383336, 1.00383336, 1.01383336,
 0.97189565, 0.98189565, 0.99189565, 1.00189565, 1.01189565, 1.02189565,
 0.97820705, 0.98820705, 0.99820705, 1.00820705, 1.01820705, 1.02820705])

# data is rewritten into matrix vector form using split and stack
data_split = np.split(data,5)
data_stack = np.stack(data_split)
print(data_stack)

Output:

data_stack = [[0.93380229 0.94380229 0.95380229 0.96380229 0.97380229 0.98380229]
 [0.95261115 0.96261115 0.97261115 0.98261115 0.99261115 1.00261115]
 [0.96383336 0.97383336 0.98383336 0.99383336 1.00383336 1.01383336]
 [0.97189565 0.98189565 0.99189565 1.00189565 1.01189565 1.02189565]
 [0.97820705 0.98820705 0.99820705 1.00820705 1.01820705 1.02820705]]

然后我把矩阵变成一个真假矩阵:

over1 = data_stack >= 1

Output:

over1 = [[False False False False False False]
 [False False False False False  True]
 [False False False False  True  True]
 [False False False  True  True  True]
 [False False False  True  True  True]]

最后,我发现每列中第一次出现 true :

# row number where 1 was reached
index = np.argmax(over1, axis=0)
print(index)

Output:

index = [0 0 0 3 2 1]

你可以试试这个:

data = [0.9338022866253757, 0.9438022866253757, 0.9538022866253757, 0.9638022866253757, 0.9738022866253757, 0.9838022866253757,
0.9526111539604993, 0.9626111539604993, 0.9726111539604994, 0.9826111539604994, 0.9926111539604994, 1.0026111539604994,
0.9638333594112685, 0.9738333594112685, 0.9838333594112684, 0.9938333594112684, 1.0038333594112685, 1.0138333594112683,
0.9718956496941793, 0.9818956496941793, 0.9918956496941793, 1.0018956496941793, 1.0118956496941793, 1.0218956496941793,
0.9782070486192962, 0.9882070486192962, 0.9982070486192962, 1.0082070486192962, 1.0182070486192962, 1.0282070486192962]

cols = 6
lst = [[]]*cols

for i, e in enumerate(data):
  n = i%6
  lst[n] = lst[n] + [e]

def get_first_above_one(l):
  for i,e in enumerate(l):
    if e > 1:
      return i
  return 0

[get_first_above_one(l) for l in lst]
#Out[61]: [0, 0, 0, 3, 2, 1]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM