将字符串列添加到浮点矩阵NumPy

时间:2018-11-13 10:54:57

标签: python string numpy matrix floating-point

我正在寻找一种将一列float值添加到字符串值矩阵的方法。

Mymatrix = 
[["a","b"],
 ["c","d"]]

我需要一个像这样的矩阵

[["a","b",0.4],
 ["c","d",0.6]]

3 个答案:

答案 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中混合数据类型,但可以在structuredrecord 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?