试图创建一个标记的numpy数组

时间:2015-11-04 21:44:30

标签: python arrays numpy

我希望有一个numpy数组,其中包含每个值的值和相应的标签。我正在使用此数组进行线性回归,它将是方程X中的y = Xb + error数据向量。

我的X向量由大约20个变量组成,我希望每个变量都可以通过名称X['variable1']引用。我最初使用字典来做这个,但意识到用于线性回归的scikit库需要一个numpy矩阵,所以我正在尝试构建一个标记的numpy数组。

我一直收到错误声明:

TypeError: a bytes-like object is required, not 'int'.

这就是我正在做的事情:

X = np.array([3],dtype=[('label1','int')])

我最终想要有20个标记值,如下所示:

X = np.array([3,40,7,2,...],
             dtype=[('label1',int'),('label2','int'),('label3','int')...])

非常感谢这里有关语法的任何帮助。谢谢!

2 个答案:

答案 0 :(得分:5)

使用值创建结构化数组的正确方法是使用元组列表:

In [55]: X
Out[55]: 
array([(3,)], 
      dtype=[('label1', '<i4')])

In [56]: X=np.array([(3,4)],dtype=[('label1',int),('label2',int)])

In [57]: X
Out[57]: 
array([(3, 4)], 
      dtype=[('label1', '<i4'), ('label2', '<i4')])

但我应该提醒你,这样的数组不是2d(或矩阵),它是1d的字段:

In [58]: X.shape
Out[58]: (1,)

In [59]: X.dtype
Out[59]: dtype([('label1', '<i4'), ('label2', '<i4')])

你不能跨领域做数学; X*2X.sum()会产生错误。在X这样的等式中使用y = X*b + error将毫无希望。

你可能最好使用真正的2d数字数组,并在头脑中的标签和列号之间进行映射,或者使用字典进行映射。

或者使用熊猫。

答案 1 :(得分:0)

由于有20个变量,内存不是问题,你可以继续使用词典:

from collections import OrderedDict  # Dictionary that remembers insertion order
import numpy as np

dd = OrderedDict()
dd["Var1"] = 10
dd["Var2"] = 20
dd["Var3"] = 30

# make numpy array from dict:
xx = np.array([v for v in dd.values()])  

# make dict() from array:
xx2 = 2*xx
dd2 = OrderedDict((k, v) for (k,v) in zip(dd.keys(), xx2))