将两个不同大小的列表合并为一个矩阵

时间:2017-12-25 23:29:07

标签: python arrays python-2.7 numpy

鉴于:

X = [[1, 0, 1, 1], [1, 1, 1, 1], [1, 0, 0, 0]]
y = [1, -1, 0]
X = np.asarray(X, np.uint8)
y = np.asarray(y, np.int8).T
con = np.concatenate(X, y)
print(con)

其中X应该是大小为(3,4)的数据集,而y是矩阵X中每行的类标签。例如,X[0]= [1, 0, 1, 1]y[0]中的类标签等于1,即y[0]=1。我想将Xy合并到一个大小为(3,5)的矩阵中,其中新列是y列表。但是,前面的代码给了我这个错误:

Traceback (most recent call last):
  File "test.py", line 38, in <module>
    con = np.concatenate(X, y)
TypeError: only integer scalar arrays can be converted to a scalar index

我不确定如何修复它。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

的第一个问题
np.concatenate(X, y)

是第二个参数应该是轴,而不是第二个数组。如果np.concatenate((X, y), axis=1)X具有相同的形状,则y会起作用。但他们没有。

In [181]: X = [[1, 0, 1, 1], [1, 1, 1, 1], [1, 0, 0, 0]]
     ...: y = [1, -1, 0]
     ...: 
In [182]: np.column_stack((X,y))
Out[182]: 
array([[ 1,  0,  1,  1,  1],
       [ 1,  1,  1,  1, -1],
       [ 1,  0,  0,  0,  0]])

column_stack确保输入具有连接为列的正确形状:

In [183]: np.concatenate((X,y),axis=1)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-183-a97a3320ed3e> in <module>()
----> 1 np.concatenate((X,y),axis=1)

ValueError: all the input arrays must have same number of dimensions

In [184]: np.concatenate((X,np.array(y)[:,None]),axis=1)
Out[184]: 
array([[ 1,  0,  1,  1,  1],
       [ 1,  1,  1,  1, -1],
       [ 1,  0,  0,  0,  0]])

但是在连接具有不同数据类的数组时要小心。 y是类标签。但是什么是X?同样的单位?如果它包含浮动,则连接的数组也将浮动。我怀疑这只是使用其他类标签更有意义的代码的一步,例如pandas或其中一个机器学习包。

答案 1 :(得分:0)

你也可以使用列表,并在最后转换为矩阵(2-dim数组,更具体):

X = [[1, 0, 1, 1], [1, 1, 1, 1], [1, 0, 0, 0]]
y = [1, -1, 0]
myList = [foo[0]+[foo[1]] for foo in zip(X,y)]
myMatrix = np.array(myList)

给你:

array([[ 1,  0,  1,  1,  1],
       [ 1,  1,  1,  1, -1],
       [ 1,  0,  0,  0,  0]])

但我会将标签行对存储在字典中:

{foo[1]:foo[0] for foo in zip(X,y)}

给你:

{-1: [1, 1, 1, 1], 0: [1, 0, 0, 0], 1: [1, 0, 1, 1]},

为您提供了更大的灵活性,您仍然可以像这样进入一个numpy数组:

np.array([v+[k] for k,v in myDict.items()])