2016-10-24 1 views
1

я пытаюсь создать эту структуру данных в Python: 2-d array structureСоздание 2-D массив с ключами столбцов и ключей строк в Python

Там должны быть ключи столбцов и ряда клавиш, что я буду используя позже. Клавиши столбцов и клавиши строк являются случайными числами.

Теперь у меня есть этот код:

import random 

cols, rows = 5, 5 
Matrix = [[0 for x in range(cols)] for y in range(rows)] 

set_col = 0 
for row in Matrix: 
    row[set_col] = random.randint(1,2) 

columnKeys = random.sample(range(1,5), 4) 
Matrix[0] = columnKeys 

for row in Matrix: 
    print(row) 

Выход:

[3, 1, 2, 4] 
[2, 0, 0, 0, 0] 
[1, 0, 0, 0, 0] 
[2, 0, 0, 0, 0] 
[1, 0, 0, 0, 0] 

Это не совсем то, что я хочу. На данный момент каждое значение ячейки имеет ноль. Но позже у него будут некоторые релевантные данные, и я буду использовать эти данные вместе с соответствующими командами строк и столбцов. Я не знаю, как правильно организовать эту структуру данных, поэтому я могу использовать значения ячеек с соответствующими ключами строки/столбца.


Как сделать это без панд и Numpy так что я могу использовать для столбцов и строк ключей?

ответ

1

Это зависит от того, что вы хотите.

Лучшим способом является, вероятно, не, чтобы использовать вложенные списки, а вместо этого использовать словари. Поскольку вы упомянули pandas, объекты pandas DataFrame имеют функцию to_dict, которая преобразует DataFrame в словарь, и есть несколько вариантов в зависимости от того, что вы предпочитаете.

Из вашего примера видно, что вы пытаетесь создать свою структуру данных с повторяющимися индексами. Лучший вариант здесь, скорее всего, будет использовать структуру, созданную при запуске df.to_dict("split").

Произнесите DataFrame (ДФ) выглядит следующим образом:

 3 1 2 4 
    2 0 0 0 0 
    1 0 0 0 0 
    2 0 0 0 0 
    1 0 0 0 0 

Запуск `df.to_dict ("сплит") будет делать это:

d = df.to_dict("split") 
{ 
    'columns': [3, 1, 2, 4], 
    'data': [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], 
    'index': [2, 1, 2, 1] 
} 

Доступ к данным в этом сценарии, и в том, что показано @Makiflow, сложно. Даже внутри Pandas наличие дублирующих индексов или столбцов на вашем Dataframe делает операции более интересными. В этом случае выбор df['data'][3][1] выбирает второй элемент в третьем списке, содержащий ключ data. Это фактически выбор четвертой строки и второго столбца вашей матрицы. Если вы хотите, чтобы иметь возможность ссылаться на столбец имя, вам нужно сделать немного больше работы с ногами.

Вы можете запустить col_num = d['columns'].index(3), который даст вам значение индекса элемента 3, но выполнение d['index'].index(2) всегда даст вам 0, даже если вы захотите выбрать 2 по индексу 3.Это потому, что index() возвращает индекс первого значения, соответствующего условию. Разумеется, вы можете просто выбрать кортежи индексов (col, row), но это в первую очередь приведет к тому, что имена столбцов и индексов будут проигнорированы.

Если вы хотите создать эту структуру без панд, вы можете запустить: COLS, ROWS = 5, 5 столбцы = [random.randint (0, COLS) для _ в диапазоне (COLS)] строк = [ random.randint (1,2) для _ в диапазоне (ROWS)]

d = {"columns": columns, 
    "index": rows, 
    "data": [[0 for _ in range(COLS)] for _ in range(ROWS)] 
    } 

ИМХО - лучшее решение будет фактически заставить вашу структуру данных, чтобы иметь уникальный индекс и столбцы значений. Выход по умолчанию to_dict() будет выводить очень просто словарь:

d = df.to_dict() # also the same as df.to_dict("dict") 
{ 
    1: {1: 0, 2: 0}, 
    2: {1: 0, 2: 0}, 
    3: {1: 0, 2: 0}, 
    4: {1: 0, 2: 0} 
} 

В этой конфигурации каждый ключ к словарю это имя столбца. Каждый из этих ключей указывает на другой дубликат, который представляет информацию в этом столбце - каждый ключ является значением индекса, за которым следует значение.

Это, вероятно, делает наиболее интуитивный смысл, потому что если вы хотите, чтобы получить значение в столбце имени 3 по индексу имени 1, вы могли бы сделать:

d = df.to_dict() 
    d[3][1] 
    # 0 

Вы можете создать эти данные структура без использования Панд просто:

COLS, ROWS = 5,5 
rows = [i for i in range(ROWS)] 
columns = [i for in range(COLS)] 
{c : {i:0 for i in rows} for c in columns} 
# { 
# 0: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0}, 
# 1: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0}, 
# 2: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0}, 
# 3: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0}, 
# 4: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0} 
# } 

Это действительно зависит от ограничений/требований, которые у вас есть.

1
import random 

COLS, ROWS = 5, 5 
Matrix = [[0 for x in range(COLS)] for y in range(ROWS)] 

set_col = 0 
for row in Matrix: 
    row[set_col] = random.randint(1,2) 

columnKeys = random.sample(range(1,5), 4) 
Matrix[0] = [0] + columnKeys 

for row in Matrix: 
    print(row) 

Выход

[0, 3, 1, 2, 4] 
[2, 0, 0, 0, 0] 
[1, 0, 0, 0, 0] 
[2, 0, 0, 0, 0] 
[1, 0, 0, 0, 0] 
Смежные вопросы