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