#python-3.x #pandas #numpy
#python-3.x #pandas #numpy
Вопрос:
У меня есть такая матрица
id = (123, 979, 234)
matrix:
123 979 234
123 0 30 45
979 30 0 60
234 15 45 0
Моя проблема в том, что я хочу получить доступ к матрице быстрым и простым способом. Что-то вроде этого:
matrix[id][id]
пример:
печать (матрица [123][979])
вывод 30
Сейчас я использую список, включающий список. Таким образом, я могу получить доступ к данным, зная позицию. Это не очень удобно, потому что я не знаю позицию, я просто знаю идентификатор. На данный момент я использую функцию, которая выдает мне правильное число. Это очень медленно, и мне это нужно для вычисления со многими итерациями.
У кого-нибудь есть идея быстро решить эту проблему?
Функция для вычисления матрицы на данный момент приведена ниже, но это всего лишь ноль или 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 ]
Комментарии:
1. приведите пример того, к чему вы обращаетесь. число? список чисел?
2. помогает ли это редактирование?
3. конечно. итак, если это массив numpy или фрейм данных pandas? можете ли вы поделиться кодом для создания «матрицы»?
4. ну, я использую только обычные списки. но подождите минутку, я приведу пример…
5. Выполнено… Надеюсь, это не слишком запутанно
Ответ №1:
Использование pandas
:
data = [[0, 30, 45], [30, 0, 60], [15, 45, 0]]
ids = [123, 979, 234]
df = pd.DataFrame(data, columns = ids, index = ids)
data
может быть сконструирован множеством способов: зависит от того, как вы строите свою матрицу. Обратитесь к документации для получения дополнительной информации.
Теперь обратитесь по идентификатору:
>>> df[979][123]
30
Примечание: порядок идентификаторов обратный, поскольку pandas
в качестве первого индекса используется идентификатор столбца.
Комментарии:
1. это так фантастично!!! Я получил ускорение с 1: 43 минуты до 9 секунд. просто обратившись к таким данным вместо вызова функции.