У меня следующая проблема: у меня есть матрица, открытая с модулем pandas
, где каждая ячейка имеет число от -1 до 1. То, что я хотел найти, - это максимальное "возможное" значение в строке, которое такжене максимальное значение в другом ряду.
Если, например, в одном столбце максимальное значение имеет, например, 2 строки, я сравниваю оба значения и беру большее значение, а затем для строки, максимальное значение которой меньше, чем в другой строке, я взял второй максимумзначение (и повторять один и тот же анализ снова и снова).
Чтобы объяснить себя, лучше рассмотрите мой код
import pandas as pd
matrix = pd.read_csv("matrix.csv")
# this matrix has an id (or name) for each column
# ... and the firt column has the id of each row
results = pd.DataFrame(np.empty((len(matrix),3),dtype=pd.Timestamp),columns=['id1','id2','max_pos'])
l = len(matrix.col[[0]]) # number of columns
while next = 1:
next = 0
for i in range(0, len(matrix)):
max_column = str(0)
for j in range(1, l): # 1 because the first column is an id
if matrix[max_column][i] < matrix[str(j)][i]:
max_column = str(j)
results['id1'][i] = str(i) # I coul put here also matrix['0'][i]
results['id2'][i] = max_column
results['max_pos'][i] = matrix[max_column][i]
for i in range(0, len(results)): #now I will check if two or more rows have the same max column
for ii in range(0, len(results)):
# if two id1 has their max in the same column, I keep it with the biggest
# ... max value and chage the other to "-1" to iterate again
if (results['id2'][i] == results['id2'][ii]) and (results['max_pos'][i] < results['max_pos'][ii]):
matrix[results['id2'][i]][i] = -1
next = 1
Пример:
#consider
pd.DataFrame({'a':[1, 2, 5, 0], 'b':[4, 5, 1, 0], 'c':[3, 3, 4, 2], 'd':[1, 0, 0, 1]})
a b c d
0 1 4 3 1
1 2 5 3 0
2 5 1 4 0
3 0 0 2 1
#at the first iterarion I will have the following result
0 b 4 # this means that the row 0 has its maximum at column 'b' and its value is 4
1 b 5
2 a 5
3 c 2
#the problem is that column b is the maximum of row 0 and 1, but I know that the maximum of row 1 is bigger than row 0, so I take the second maximum of row 0, then:
0 c 3
1 b 5
2 a 5
3 c 2
#now I solved the problem for row 0 and 1, but I have that the column c is the maximum of row 0 and 3, so I compare them and take the second maximum in row 3
0 c 3
1 b 5
2 a 5
3 d 1
#now I'm done. In the case that two rows have the same column as maximum and also the same number, nothing happens and I keep with that values.
#what if the matrix would be
pd.DataFrame({'a':[1, 2, 5, 0], 'b':[5, 5, 1, 0], 'c':[3, 3, 4, 2], 'd':[1, 0, 0, 1]})
a b c d
0 1 5 3 1
1 2 5 3 0
2 5 1 4 0
3 0 0 2 1
#then, at the first itetarion the result will be:
0 b 5
1 b 5
2 a 5
3 c 2
#then, given that the max value of row 0 and 1 is at the same column, I should compare the maximum values
# ... but in this case the values are the same (both are 5), this would be the end of iterating
# ... because I can't choose between row 0 and 1 and the other rows have their maximum at different columns...
Этот код работаетидеально подходит для меня, если у меня есть матрица 100x100, например.Но, если размер матрицы достигает 50 000 x 50 000, код занимает много времени для его завершения.Я теперь, что мой код может быть самым неэффективным способом сделать это, но я не знаю, как с этим справиться.
Я читал о потоках в Python, которые могут помочь, но это не поможет, если я добавлю 50 000 потоков, потому что мой компьютер не использует больше ЦП.Я также пытался использовать некоторые функции как .max()
, но я не могу получить столбец максимума и сравнить его с другим максимумом ...
Если кто-нибудь может помочь мне дать мне кусоксовет, чтобы сделать это более эффективным, я был бы очень признателен.