【问题标题】:Merge two lists of different size into one matrix将两个不同大小的列表合并为一个矩阵
【发布时间】:2018-06-06 22:45:42
【问题描述】:

鉴于:

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

我不知道如何解决它。任何帮助表示赞赏。

【问题讨论】:

  • 创建一个适当大小的数组,然后从列表中赋值?
  • 再看一下文档!提示:concatenate((a1, a2, ...),...。 (我更喜欢 concat 而不是上述评论中的方法)
  • 你在con = np.hstack((X, y.reshape(-1,1)))之后吗?
  • @MaxU 谢谢马克斯。这正是我正在寻找的。没有足够的积分来投票给你。

标签: python arrays python-2.7 numpy


【解决方案1】:

第一个问题

np.concatenate(X, y)

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

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 或机器学习包之一。

【讨论】:

    【解决方案2】:

    您还可以使用列表,并在最后转换为矩阵(更具体的二维数组):

    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()])
    

    【讨论】:

      猜你喜欢
      • 2019-09-23
      • 2023-03-09
      • 2016-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-23
      • 1970-01-01
      相关资源
      最近更新 更多