以特定格式创建numpy数组

时间:2015-03-01 06:58:07

标签: python numpy

这是trainData

[[-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]]
]

2 个答案:

答案 0 :(得分:1)

混合不同形状的阵列需要一些妥协。正常的array具有恒定的尺寸。

示例数据:

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

您可以将它们组合成一个2d数组,通过连接,将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,))])

但请注意,每一行都是&#39;显示为([...].[...])

原始数据可以被恢复&#39;使用combine['td']combine['target']。并且数组的元素为combine[0]

但是combine并没有为你做很多事。您可以使用combine['td']*combine['target']等字段进行数学运算,但您可以使用td*target进行数学运算。您无法combine[:2] *= 2,即可同时对两个字段执行操作。

答案 1 :(得分:0)

我认为普通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列表或一些自定义容器对象。