【问题标题】:issue in combining python list and numpy array?结合python列表和numpy数组的问题?
【发布时间】:2015-09-17 17:49:39
【问题描述】:

我有两个 python 列表和一个 numpy 数组。 numpy 数组如下所示:

[array([93495052.969556, 98555123.061462])]
[array([1000976814.605984, 998276347.359732])]
[array([6868127850.435482, 6903911250.620625])]
[array([775127467.947004, 802369832.938230])]

numpy array 由以下代码组成:

array1 = []
company = []
state = []

def process_chunk(chuk):

    training_set_feature_list = []
    training_set_label_list = []
    test_set_feature_list = []
    test_set_label_list = []
    np.set_printoptions(suppress=True)

    array2 = []


    # to divide into training & test, I am putting line 10th and 11th in test set
    count = 0
    for line in chuk:
        # Converting strings to numpy arrays
        if count == 9:   
            test_set_feature_list.append(np.array(line[3:4],dtype = np.float))
            test_set_label_list.append(np.array(line[2],dtype = np.float))
            company.append(line[0])
            state.append(line[1])
        elif count == 10:
            test_set_feature_list.append(np.array(line[3:4],dtype = np.float))
            test_set_label_list.append(np.array(line[2],dtype = np.float))

        else:    
            training_set_feature_list.append(np.array(line[3:4],dtype = np.float))
            training_set_label_list.append(np.array(line[2],dtype = np.float))
        count += 1
    # Create linear regression object
    regr = linear_model.LinearRegression()
    # Train the model using the training sets
    regr.fit(training_set_feature_list, training_set_label_list)

    #print test_set_feature_list

    array2.append(np.array(regr.predict(test_set_feature_list),dtype = np.float))
    np.set_printoptions(formatter={'float_kind':'{:f}'.format})
    for items in array2:
        array1.append(items)

array1 是我想加入两个 python 列表的 numpy 数组

第一个 python 列表是company,如下所示:

['OT', 'OT', 'OT', 'OT',....]

第二个python列表是状态:

['Alabama', 'Alabama', 'Alabama', 'Alabama', ...]

现在我要做的是形成一个具有以下结构的列表:

('OT', 'Alabama', 729, 733)
('OT', 'Alabama', 124, 122)
('OT', 'Arizona', 122, 124)

我写了这行代码 - final_list = zip(company,state,array1) 但这会产生这个输出(在数组元素周围添加了 array[]):

('OT', 'Alabama', array([729, 733]))
('OT', 'Alabama', array([124, 122]))

如何加入这些列表和数组,形成一个没有上述问题的列表?

【问题讨论】:

  • array1 是什么样的?你能做print(array1) 并更新它的结果吗?
  • @AnandSKumar 它显示在我上面的帖子中
  • @AnandSKumar 我已经提供了形成array1 和array2 的确切代码。该函数运行多次。

标签: python arrays list numpy


【解决方案1】:

如果 array1 看起来像 -

array1 = np.array([np.array([729, 733]), np.array([124, 122]) ...])

虽然给出了您的代码(以及 array1.append() 的用法,但看起来 array1 是一个列表)。您可以先将array1列表转换为numpy.array为-

narray1 = np.array(array1)           #This step not necessary , if array1 is already numpy array , in that case use `array1` instead of `narray1` .

如果每个元素只有两个值,你可以这样做 -

final_list = zip(company,state,narray1[:,0], narray1[:,1])

演示 -

In [59]: array1 = [np.array([729, 733]), np.array([124, 122])]

In [60]: company = ['OT', 'OT']

In [61]: state = ['Alabama', 'Alabama']

In [62]: narray1 = np.array(array1)

In [63]: final_list = zip(company,state,narray1[:,0], narray1[:,1])

In [65]: final_list
Out[65]: [('OT', 'Alabama', 729, 733), ('OT', 'Alabama', 124, 122)]

【讨论】:

  • 我得到了一些奇怪的输出结构。这可能是因为我的 numpy 数组的形成方式。我已经更新了我上面的帖子以包含形成 numpy 数组的代码
  • 使用* 后得到的输出是什么?
  • 而不是array1,尝试使用array2regr.predict(test_set_feature_list) 的结果是什么?
  • array2 是我的代码中的临时数组,array1 是全局数组。我没有使用array2,因为每次迭代代码都会刷新它。所以在刷新之前,我将 array2 的内容添加到全局 array1
  • 那么您需要显示array1 的精确打印,您显示的数组看起来不像有效数组(指向问题中的数组)。
【解决方案2】:

您似乎正在尝试创建结构化数组或其等效列表(元组列表)

为方便起见,让我们用您的数据创建一个元组列表。我不会详细说明如何从其他部分创建它(现在):

In [19]: data = [('OT', 'Alabama', 729, 733),
('OT', 'Alabama', 124, 122),
('OT', 'Arizona', 122, 124)]

定义一个复合dtype(几种可能的格式之一):

In [23]: dt = np.dtype('S2,S10,i,i')

和结构化数组:

In [24]: A=np.array(data,dtype=dt)

In [25]: A
Out[25]: 
array([('OT', 'Alabama', 729, 733), ('OT', 'Alabama', 124, 122),
       ('OT', 'Arizona', 122, 124)], 
      dtype=[('f0', 'S2'), ('f1', 'S10'), ('f2', '<i4'), ('f3', '<i4')])

可以通过字段名访问:

In [26]: A['f1']
Out[26]: 
array(['Alabama', 'Alabama', 'Arizona'], 
      dtype='|S10')

In [27]: A['f2']
Out[27]: array([729, 124, 122])

转换回元组列表:

In [28]: A.tolist()
Out[28]: 
[('OT', 'Alabama', 729, 733),
 ('OT', 'Alabama', 124, 122),
 ('OT', 'Arizona', 122, 124)]

您还可以创建一个具有正确大小和 dtype 的空(或零)数组,并逐行或逐字段填充它

A1 = np.zeros((3,),dtype=dt)
A1['f0']=['OT','OT','OT']
A1['f2']=np.array([729,124,122])
etc

如果数字在 (3,2) 整数数组中,您可以使用:

A1['f2']=x[:,0]
A1['f3']=x[:,1]

【讨论】:

    猜你喜欢
    • 2020-08-02
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2017-11-03
    相关资源
    最近更新 更多