Python 向NumPy数组添加行/列标题

Python 向NumPy数组添加行/列标题,python,matrix,numpy,Python,Matrix,Numpy,我有一个NumPyndarray,我想在其中添加行/列标题 数据实际上是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,

我有一个
NumPy
ndarray
,我想在其中添加行/列标题

数据实际上是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阵列

如何在第一行和第一列中插入标题,使每个数组在我的
CSV
输出文件中看起来像这样?

        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
现在,我所做的是制作数组7x13x13并插入数据,这样我就有了一行和一列零,但我更喜欢字符串


我想我可以编写一个Excel宏,用字符串替换零。但是,问题是如果我尝试将这些零重新指定为我想要的字符串,则
NumPy
无法将
string
转换为
float

我不知道有什么方法可以将头添加到矩阵中(即使我发现它很有用)。我要做的是创建一个小类,为我打印对象,重载
\uu str\uu
函数

大概是这样的:

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')

一般认为这会起作用

输入

代码


不是很确定,但是你可以考虑看一下。

NoMy将处理n维数组,但是很多设施都局限于二维数组。甚至不确定输出文件的外观

许多想要命名专栏的人忽视了numpy的功能。很好的东西要知道,但这只是“命名”一个维度

对于二维,这是非常酷的

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
如果输出是您在这里试图解决的唯一问题,我可能会坚持使用几行手工编码的魔术,因为它比为一个功能安装另一个软件包要轻。

使用它,您可以将列和索引写入文件:

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    

我不熟悉numpy,但如果它们只是列表,这将是非常直接的。这样的解决方案可以接受吗?你能将numpy矩阵转换成列表吗?numpy矩阵的工作方式是,它们可以作为列表的列表,因此你可以自己对它们进行迭代。这看起来很有希望。在试图把我的问题提炼出来的过程中,我把事情弄糊涂了,因为大矩阵实际上并不是由带标签的小矩阵组成的。我试着把它分开,并实施你的建议,但它不起作用。首先,我在这一行有一个“列表索引超出范围”s+=“%s%s”%(self.head[I],self.sep)如果a是唯一的矩阵,而不是处理一个由矩阵组成的矩阵,您的建议会有什么变化?我想,由于矩阵的大小不同,您会得到一个索引超出范围的错误。目前,此代码仅适用于6x6矩阵(即len(['a','b','c','d','e','f'])。只需将定义self.head的行更改为您的矩阵大小(例如,如果您的矩阵为3x3,则该行应类似于self.head=['a'、'b'、'c'])。希望这有帮助!我收到一个错误,
“numpy.ndarray”对象没有属性“insert”
任何解决方案建议?包括解决方案。我把numpy mats转换成了列表,做了手术后又转换回来了。Numpy insert例程非常愚蠢,否则我看不出它们是如何有用的谢谢。我最终找到了答案。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
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=' ')
  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