【问题标题】:Creating a numpy array in a particular format以特定格式创建一个 numpy 数组
【发布时间】:2015-03-01 06:58:06
【问题描述】:

这是训练数据

[[-214. -153.  -58. ...,   36.  191.  -37.]
[-139.  -73.   -1. ...,   11.   76.  -14.]
[ -76.  -49. -307. ...,   41.  228.  -41.]
..., 
[ -32.  -49.   49. ...,  -26.  133.  -32.]
[-124.  -79.  -37. ...,   39.  298.   -3.]
[-135. -186.  -70. ...,  -12.  790.  -10.]]

这是目标

[[0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]

我想使用 trainData 和 target 创建一个 numpy 数组,看起来像这样

[
 [[-214. -153.  -58. ...,   36.  191.  -37.], [0]]
 [[-139.  -73.   -1. ...,   11.   76.  -14.], [0]]
 [[ -76.  -49. -307. ...,   41.  228.  -41.], [0]]
 ..., 
 [[ -32.  -49.   49. ...,  -26.  133.  -32.], [1]]
 [[-124.  -79.  -37. ...,   39.  298.   -3.], [1]]
 [[-135. -186.  -70. ...,  -12.  790.  -10.], [1]]
]

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    混合具有不同形状的数组需要一些折衷。普通的array 周围有恒定的尺寸。

    样本数据:

    In [343]: td = np.arange(20.).reshape(5,4)
    In [344]: target=np.arange(5).reshape(5,1)*10
    

    您可以通过串联将它们组合成一个二维数组,将target 作为额外列添加到td

    In [345]: np.hstack([td,target])
    Out[345]: 
    array([[  0.,   1.,   2.,   3.,   0.],
           [  4.,   5.,   6.,   7.,  10.],
           [  8.,   9.,  10.,  11.,  20.],
           [ 12.,  13.,  14.,  15.,  30.],
           [ 16.,  17.,  18.,  19.,  40.]])
    

    结构化数组似乎更接近您的目标。最简单的方法是先做一个空的合适的形状,然后用数据填充

    In [346]: combine=np.empty((5,),dtype=[('td','f',(4,)),('target','i',(1,))])
    

    然后逐个字段填写

    In [347]: combine['td']=td
    In [348]: combine['target']=target
    

    结果:

    In [349]: combine
    Out[349]: 
    array([([0.0, 1.0, 2.0, 3.0], [0]), ([4.0, 5.0, 6.0, 7.0], [10]),
           ([8.0, 9.0, 10.0, 11.0], [20]), ([12.0, 13.0, 14.0, 15.0], [30]),
           ([16.0, 17.0, 18.0, 19.0], [40])], 
          dtype=[('td', '<f4', (4,)), ('target', '<i4', (1,))])
    

    但请注意,每个“行”都显示为 ([...].[...])

    可以使用combine['td']combine['target']“恢复”原始数据。并且数组的一个元素为combine[0]

    但是combine 并没有为你做很多事情。您可以使用combine['td']*combine['target'] 之类的字段进行数学运算,但您可以使用td*target 进行数学运算。你不能combine[:2] *= 2,即同时作用于两个字段。

    【讨论】:

    • 似乎使用结构化数组是这里的方法(+1)
    【解决方案2】:

    我相信普通的numpy 数组在所有维度上强制执行相同的形状,这意味着您不能有一些比其他条目更大的条目。有关此事,请参阅this related answer。如果你只是想加入你的两个数组,你可以这样做:

    import numpy
    trainingData = numpy.array([[-214., -153, -58., 5],[-139, -73, -1, 2]])
    target = numpy.array([[0],[1]])
    combined = numpy.concatenate((trainingData,target), axis=1)
    

    如果您真的想将目标和训练数据保存在不同长度的单独子数组中并且必须使用 numpy,您可以只使用 numpy 对象数组,例如

    combined = numpy.array(zip(trainingData,target))
    

    但实际上,使用 python 列表或一些自定义容器对象可能会更好。

    【讨论】:

      猜你喜欢
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-30
      • 2020-09-22
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      相关资源
      最近更新 更多