我正在寻找一种将一列float值添加到字符串值矩阵的方法。
Mymatrix =
[["a","b"],
["c","d"]]
我需要一个像这样的矩阵
[["a","b",0.4],
["c","d",0.6]]
答案 0 :(得分:1)
我建议改用pandas
DataFrame:
import pandas as pd
df = pd.DataFrame([["a","b",0.4],
["c","d",0.6]])
print(df)
0 1 2
0 a b 0.4
1 c d 0.6
您还可以指定列(Series
)的名称:
df = pd.DataFrame([["a","b",0.4],
["c","d",0.6]], columns=['A', 'B', 'C'])
df
A B C
0 a b 0.4
1 c d 0.6
答案 1 :(得分:0)
您需要了解为什么要这样做。 Numpy是高效的,因为数据在内存中对齐。因此,混合类型通常是性能不佳的根源。但由于所有字符串的长度相同,因此可以保留对齐方式。由于类型不是同质的,因此可以使用structured array:
raw=[["a","b",0.4],
["c","d",0.6]]
dt=dtype([('col0','U1'),('col1','U1'),('col2',float)])
aligned=ndarray(len(raw),dt)
for i in range (len(raw)):
for j in range (len(dt)):
aligned[i][j]=raw[i][j]
您也可以使用熊猫,但是您经常会失去一些性能。
答案 2 :(得分:0)
如前所述,您不能在ndarray中混合数据类型,但可以在structured或record array中进行混合。它们的相似之处在于您可以混合使用dtype=
参数定义的数据类型(它定义了数据类型和字段名称)。记录数组允许按属性而不是仅按索引访问结构化数组的字段。当您要在数组之间复制整个内容时,不需要for
循环。请参阅下面的示例(使用您的数据):
Mymatrix = np.array([["a","b"], ["c","d"]])
Mycol = np.array([0.4, 0.6])
dt=np.dtype([('col0','U1'),('col1','U1'),('col2',float)])
new_recarr = np.empty((2,), dtype=dt)
new_recarr['col0'] = Mymatrix[:,0]
new_recarr['col1'] = Mymatrix[:,1]
new_recarr['col2'] = Mycol[:]
print (new_recarr)
结果输出如下:
[('a', 'b', 0.4) ('c', 'd', 0.6)]
从那里使用格式化的字符串进行打印。
如果在我的示例中颠倒了分配顺序,则还可以从recarray复制到ndarray。
注意:我发现使用Recarrays可能会严重降低性能。请参阅此线程中的答案:
is ndarray faster than recarray access?