numpy:使用不同的列类型快速创建recarray

时间:2018-10-09 17:24:11

标签: python numpy recarray

我正在尝试根据一系列具有列名和混合变量类型的numpy数组创建一个Recarray。

以下方法有效,但速度较慢:

    import numpy as np
    a = np.array([1,2,3,4], dtype=np.int)
    b = np.array([6,6,6,6], dtype=np.int)
    c = np.array([-1.,-2.-1.,-1.], dtype=np.float32)
    d = np.array(list(zip(a,b,c,d)),dtype = [('a',np.int),('b',np.int),('c',np.float32)])
    d = d.view(np.recarray())

我认为应该有一种方法可以使用np.stack((a,b,c),axis = -1),它比list(zip())方法要快。但是,似乎没有简单的方法来进行堆叠保留列类型。 This link的确显示了操作方法,但是它很笨拙,我希望有更好的方法。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

line_id可能就是您想要的:

$prev_line_id = $lineItem[0]['line_id'] ?? null;
$i = 0;
foreach($lineItem  as $line)
{
    if($line['line_id'] != $prev_line_id )
    {
        $i++;
        $prev_line_id = $line['line_id'];
    }

    echo $i; //line number
    echo $line['field_changed'];
    echo $line['change_date'];
    echo $line['change_from'];
    echo $line['change_to'];
}

答案 1 :(得分:0)

这是我评论过的逐场研究方法:

In [308]:     a = np.array([1,2,3,4], dtype=np.int)
     ...:     b = np.array([6,6,6,6], dtype=np.int)
     ...:     c = np.array([-1.,-2.,-1.,-1.], dtype=np.float32)
     ...:     dt = np.dtype([('a',np.int),('b',np.int),('c',np.float32)])
     ...: 
     ...: 

(我必须更正您粘贴复制的c)。

In [309]: arr = np.zeros(a.shape, dtype=dt)
In [310]: for name, x in zip(dt.names, [a,b,c]):
     ...:     arr[name] = x
     ...:     
In [311]: arr
Out[311]: 
array([(1, 6, -1.), (2, 6, -2.), (3, 6, -1.), (4, 6, -1.)],
      dtype=[('a', '<i8'), ('b', '<i8'), ('c', '<f4')])

由于通常数组比字段具有更多的记录(行),因此它应该比元组列表方法快。在这种情况下,它的速度可能是可以弥补的。

In [312]: np.array(list(zip(a,b,c)), dtype=dt)
Out[312]: 
array([(1, 6, -1.), (2, 6, -2.), (3, 6, -1.), (4, 6, -1.)],
      dtype=[('a', '<i8'), ('b', '<i8'), ('c', '<f4')])

rec.fromarrays在完成确定dtype的设置后会执行以下操作:

_array = recarray(shape, descr)
# populate the record array (makes a copy)
for i in range(len(arrayList)):
    _array[_names[i]] = arrayList[i]

使用stack的唯一方法是先创建Recarray:

In [315]: [np.rec.fromarrays((i,j,k), dtype=dt) for i,j,k in zip(a,b,c)]
Out[315]: 
[rec.array((1, 6, -1.),
           dtype=[('a', '<i8'), ('b', '<i8'), ('c', '<f4')]),
 rec.array((2, 6, -2.),
           dtype=[('a', '<i8'), ('b', '<i8'), ('c', '<f4')]),
 rec.array((3, 6, -1.),
           dtype=[('a', '<i8'), ('b', '<i8'), ('c', '<f4')]),
 rec.array((4, 6, -1.),
           dtype=[('a', '<i8'), ('b', '<i8'), ('c', '<f4')])]
In [316]: np.stack(_)
Out[316]: 
array([(1, 6, -1.), (2, 6, -2.), (3, 6, -1.), (4, 6, -1.)],
      dtype=(numpy.record, [('a', '<i8'), ('b', '<i8'), ('c', '<f4')]))