Подтвердить что ты не робот

Добавление заголовков столбцов/столбцов к матрицам Numpy

У меня есть многомерная матрица (с использованием numpy), к которой я хотел бы добавить заголовки столбцов/столбцов. Фактически данные 7x12x12, но я могу представить это следующим образом:

  A=[[[0, 1, 2, 3, 4, 5],
      [1, 0, 3, 4, 5, 6],
      [2, 3, 0, 5, 6, 7],
      [3, 4, 5, 0, 7, 8],
      [4, 5, 6, 7, 0, 9],
      [5, 6, 7, 8, 9, 0]]


     [[0, 1, 2, 3, 4, 5],
      [1, 0, 3, 4, 5, 6],
      [2, 3, 0, 5, 6, 7],
      [3, 4, 5, 0, 7, 8],
      [4, 5, 6, 7, 0, 9],
      [5, 6, 7, 8, 9, 0]]]

где A - моя матрица 2x6x6.

В любом случае, Как вставлять заголовки в первую строку и первый столбец, чтобы каждая матрица выглядела так:

        A, a, b, c, d, e, f 
        a, 0, 1, 2, 3, 4, 5,
        b, 1, 0, 3, 4, 5, 6,
        c, 2, 3, 0, 5, 6, 7,
        d, 3, 4, 5, 0, 7, 8,
        e, 4, 5, 6, 7, 0, 9,
        f, 5, 6, 7, 8, 9, 0

в моем выходном файле csv?

Теперь я сделал матрицу 7x13x13 и вставил данные так, что у меня есть строка и столбец из 0, но я бы предпочел строки. Я думаю, я мог бы просто написать макрос excel, чтобы заменить нули на строки... Проблема в том, что numpy не может преобразовать строку в float, если я попытаюсь переназначить эти 0 как строки, которые я хочу.

4b9b3361

Ответ 1

Numpy будет обрабатывать n-мерный массив в порядке, но возможности объектов ограничены двумерными массивами. Даже не уверен, как вы хотите, чтобы выходной файл выглядел.

Многие люди, которые хотели бы использовать именованные столбцы, могут игнорировать возможности numpy recarray(). Хорошие вещи, чтобы знать, но только "имена" одного измерения.

Для двух измерений Pandas очень круто.

In [275]: DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6])],
   .....:                      orient='index', columns=['one', 'two', 'three'])
Out[275]: 
   one  two  three
A    1    2      3
B    4    5      6

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

Ответ 2

С pandas.DataFrame.to_csv вы можете записать столбцы и индекс в файл:

import numpy as np
import pandas as pd

A = np.random.randint(0, 10, size=36).reshape(6, 6)
names = [_ for _ in 'abcdef']
df = pd.DataFrame(A, index=names, columns=names)
df.to_csv('df.csv', index=True, header=True, sep=' ')

предоставит вам следующий df.csv файл:

  a b c d e f 
a 1 5 5 0 4 4 
b 2 7 5 4 0 9 
c 6 5 6 9 7 0 
d 4 3 7 9 9 3 
e 8 1 5 1 9 0 
f 2 8 0 0 5 1    

Ответ 3

Подумайте, что это вообще трюк

Ввод

mats = array([[[0, 1, 2, 3, 4, 5],
    [1, 0, 3, 4, 5, 6],
    [2, 3, 0, 5, 6, 7],
    [3, 4, 5, 0, 7, 8],
    [4, 5, 6, 7, 0, 9],
    [5, 6, 7, 8, 9, 0]],

   [[0, 1, 2, 3, 4, 5],
    [1, 0, 3, 4, 5, 6],
    [2, 3, 0, 5, 6, 7],
    [3, 4, 5, 0, 7, 8],
    [4, 5, 6, 7, 0, 9],
    [5, 6, 7, 8, 9, 0]]])

код

# Recursively makes pyramiding column and row headers
def make_head(n):
    pre = ''
    if n/26:
        pre = make_head(n/26-1)

    alph = "abcdefghijklmnopqrstuvwxyz"
    pre+= alph[n%26]
    return pre

# Generator object to create header items for n-rows or n-cols
def gen_header(nitems):
    n = -1
    while n<nitems:
        n+=1
        yield make_head(n)

# Convert numpy to list
lmats = mats.tolist()

# Loop through each "matrix"
for mat in lmats:
    # Pre store number of columns as we modify it before working rows
    ncols = len(mat[0])

    # add header value to front of each row from generator object
    for row,hd in zip(mat,gen_header(len(mat))):
        row.insert(0,hd)

    # Create a "header" line for all the columns
    col_hd = [hd for hd in gen_header(ncols-1)]
    col_hd.insert(0,"A")

    # Insert header line into lead row of matrix
    mat.insert(0,col_hd)

# Convert back to numpy
mats = numpy.array(lmats)

Выход (значение, сохраненное в матах):

array([[['A', 'a', 'b', 'c', 'd', 'e', 'f'],
        ['a', '0', '1', '2', '3', '4', '5'],
        ['b', '1', '0', '3', '4', '5', '6'],
        ['c', '2', '3', '0', '5', '6', '7'],
        ['d', '3', '4', '5', '0', '7', '8'],
        ['e', '4', '5', '6', '7', '0', '9'],
        ['f', '5', '6', '7', '8', '9', '0']],

       [['A', 'a', 'b', 'c', 'd', 'e', 'f'],
        ['a', '0', '1', '2', '3', '4', '5'],
        ['b', '1', '0', '3', '4', '5', '6'],
        ['c', '2', '3', '0', '5', '6', '7'],
        ['d', '3', '4', '5', '0', '7', '8'],
        ['e', '4', '5', '6', '7', '0', '9'],
        ['f', '5', '6', '7', '8', '9', '0']]], 
      dtype='|S4')

Ответ 4

Мне неизвестен какой-либо метод добавления заголовков в матрицу (хотя я бы счел это полезным). Я бы сделал, чтобы создать небольшой класс, который печатает объект для меня, перегружая функцию __str__.

Что-то вроде этого:

class myMat:
    def __init__(self, mat, name):
        self.mat = mat
        self.name = name
        self.head = ['a','b','c','d','e','f']
        self.sep = ','

    def __str__(self):
        s = "%s%s"%(self.name,self.sep)
        for x in self.head:
            s += "%s%s"%(x,self.sep)
        s = s[:-len(self.sep)] + '\n'

        for i in range(len(self.mat)):
            row = self.mat[i]
            s += "%s%s"%(self.head[i],self.sep)
            for x in row:
                s += "%s%s"%(str(x),self.sep)
            s += '\n'
        s = s[:-len(self.sep)-len('\n')]

        return s

Затем вы можете просто распечатать их с помощью заголовков, используя следующий код:

print myMat(A,'A')
print myMat(B,'B')

Ответ 5

Не совсем уверен, но вы можете рассмотреть возможность Pandas.