у меня такая матрица
id = (123, 979, 234)
matrix:
123 979 234
123 0 30 45
979 30 0 60
234 15 45 0
Моя проблема в том, что я хочу получить доступ к матрице быстро и легко. Что-то вроде этого:
матрица[идентификатор][идентификатор]
пример:
печать (матрица [123] [979])
выход 30
Пока я использую список, включающий список. Так что я могу получить доступ к данным, зная положение. Это не очень удобно, потому что я не знаю позицию, я знаю только id. Сейчас я использую функцию, которая дает мне правильный номер. Это очень медленно, и мне это нужно для расчета с большим количеством итераций.
У кого-нибудь есть идея решить это быстрым способом?
Функция для расчета матрицы на данный момент приведена ниже, но это всего лишь ноль или 30 * 60 секунд. Я хочу создать новую матрицу с индивидуальным временем, но перед ее кодированием я хочу выяснить, каким образом я могу хранить данные, чтобы иметь быстрый и легкий доступ.
def get_matrix(permutation):
criteria = [django_model1.objects.filter(id=id).get().django_model2.format for id in permutation]
# and to speed up: an ugly combination of 2 list comprehensions and a lambda function.
return [[(lambda c1, c2: timedelta(seconds = 0 ) if c1==c2 else timedelta(seconds = 30*60 )) (c1,c2) for c2 in criteria] for c1 in criteria ]
эта правка помогает?
конечно. так что, если это массив numpy или фрейм данных pandas? Вы можете поделиться кодом для создания «матрицы»?
ну, я использую обычные списки. но подождите минутку, я приведу пример...
готово... Надеюсь, это не слишком запутанно
Использование pandas
:
data = [[0, 30, 45], [30, 0, 60], [15, 45, 0]]
ids = [123, 979, 234]
df = pd.DataFrame(data, columns = ids, index = ids)
data
можно построить разными способами: зависит от того, как вы строите свою матрицу. Обратитесь к документации для получения дополнительной информации.
Теперь обратитесь по id:
>>> df[979][123]
30
Примечание. Порядок идентификаторов обратный, поскольку pandas
принимает идентификатор столбца в качестве первого индекса.
это так фантастично!!! Я получил ускорение с 1:43 мин до 9 сек. просто получая доступ к таким данным вместо вызова функции.
приведите пример того, к чему вы обращаетесь. число? список номеров?