2017-02-17 4 views
-1

У меня есть список формата:Python список х, у и г преобразования в матрицу/таблицу

[[x_0, y_0, z_0], [x_1, y_1, z_1] ... [x_n, y_n, z_n]] 

, где может быть x_0 == x_1:

[[0, 0, z_0], [0, 1, z_1], [0, 2, z_2]... [1, 0, z_o] ... [x_n, y_n, z_n]] 

Я хочу, чтобы преобразовать его в матрица, как это (было бы неплохо, чтобы создать файл CSV):

matrix

основной Prob lem - я не знаю общий размер массива (он будет меняться каждый раз, но он всегда будет квадратным). Самый простой способ сделать этот вид трансформации?

Список - это координаты XYZ для точек.

+1

Можете ли вы более подробно объяснить, как список списков размером три на N становится матрицей 17 на 17? Тем более, что 17 равномерно не разделяет 3. Какие входные значения соответствуют выходным значениям? – Kevin

+0

@Kevin для n = 16 это сработает. В чем проблема ? –

+0

О, я вижу. Значения X и Y являются целыми индексами полученной матрицы. Я думал, что он пытался сделать что-то вроде pack [[a, b, c], [d, e, f], [g, h, i]] в квадрат 3x3, где 'a' через' i' являются значениями ячеек , – Kevin

ответ

2

Используйте pandas для создания сводной таблицы. Сводная таблица позволяет брать данные в формате строк и переставлять их в строки, столбцы и значения.

import pandas as pd 
import random 

# create some fake data 

data = [(i,j,0.1*random.randrange(1,50,1)) for i in range(5) for j in range(5)] 

# [(0, 0, 4.2), (0, 1, 1.9), (0, 2, 1.2), (0, 3, 1.2), (0, 4, 1.6), 
# (1, 0, 2.0), (1, 1, 0.9), (1, 2, 3.5), (1, 3, 3.0), (1, 4, 0.8), 
# (2, 0, 4.9), (2, 1, 2.8), (2, 2, 1.8), (2, 3, 2.7), (2, 4, 0.2), 
# (3, 0, 3.0), (3, 1, 1.8), (3, 2, 0.3, (3, 3, 3.3), (3, 4, 4.4), 
# (4, 0, 1.9), (4, 1, 4.5), (4, 2, 3.6), (4, 3, 0.4), (4, 4, 0.4)] 

# read it into a dataframe: 
df = pd.DataFrame(data, columns=['x','y','z']) 

# create pivot table with x and rows, y and columns, z as values 
df.pivot_table(values='z', index='x', columns='y') 

# y 0 1 2 3 4 
# x 
# 0 4.2 1.9 1.2 1.2 1.6 
# 1 2.0 0.9 3.5 3.0 0.8 
# 2 4.9 2.8 1.8 2.7 0.2 
# 3 3.0 1.8 0.3 3.3 4.4 
# 4 1.9 4.5 3.6 0.4 0.4 
+0

Он почти работает, но он создает не сплошной стол (например, 12x12, а 12x5, чем другой 12x5 и 12x2 ...) Как сделать сплошную таблицу 12x12? – XuMuK

2

Используйте панды и NumPy

import pandas as pd 
import numpy as np 
import math 

lis = [[0,0,3.4],[0,1,5.6],[1,0,4.3],[1,1,3.4]] 

n2 = len(lis) 
n = int(math.sqrt(n2)) 

nparray = np.zeros([n,n]) 

for l in lis: 
    nparray[[l[0],l[1]]]=l[2] 

print nparray 
#[[ 4.3 4.3] 
# [ 3.4 3.4]] 

#Output to csv 
df = pd.DataFrame(nparray) 
df.to_csv('/some/path') 
+0

это также рабочий код, но другой немного проще – XuMuK

1

Если вы хотите придерживаться стандартной библиотеки, это один метод. Создайте словарь из ваших данных, затем используйте клавиши словаря в качестве метода для заказа содержимого в формате CSV; наконец, напишите CSV-файл:

# Data = your data formatted as described 
resultsdict = {} 
csvfile = "" 
counter = 0 

# create tuple-paired key dictionary of values (i.e. (0,0): 1.2, etc) 
for pairs in data: 
    if pairs[0] > counter: 
     # track the square size 
     counter = pairs[0] 
    currentpairkey = (pairs[0], pairs[1]) 
    resultsdict[currentpairkey] = pairs[2] 

# create raw CSV data 
count = range(counter + 1) 
for x in count: 
    row = [] 
    for y in count: 
     currentpairkey = (x, y) 
     # this line is where you control your desired formatting. 
     row.append("%s" % (resultsdict[currentpairkey])) 
    print(row) 
    csvfile += "%s\n" % ",".join(row) 

# write CSV file 
with open("results.csv", "w") as f: 
    f.write(csvfile) 
Смежные вопросы