python-将col名称添加到np.array

时间:2016-05-03 19:22:27

标签: python numpy

为什么以下有效:

@Override
    public void onFinish() {
        Log.d("testTimer", "onFinish");
        if(mDataLoadedFromServer) {
            mDataSavedAndNextActivityLaunched = true;
            if (Utils.checkIfUserLoggedIn()) {
                mContext.startActivity(new Intent(mContext, ABCACtivity.class));
            } else {
                mContext.startActivity(new Intent(mContext, XYZActivity.class));
            }
            finish();
            stopTimer();
        }
    }

虽然这不是:

mat = np.array(
    [(0,0,0),
     (0,0,0),
     (0,0,0)],
    dtype=[('MSFT','float'),('CSCO','float'),('GOOG','float') ]
    )
  

TypeError:期望一个可读的缓冲区对象

如何轻松创建矩阵

  

[[无] * M] * N

但是有元组可以为列指定名称吗?

2 个答案:

答案 0 :(得分:4)

当我使用你的dtype

创建一个零数组时
In [548]: dt=np.dtype([('MSFT','float'),('CSCO','float'),('GOOG','float') ])

In [549]: A = np.zeros(3, dtype=dt)

In [550]: A
Out[550]: 
array([(0.0, 0.0, 0.0), (0.0, 0.0, 0.0), (0.0, 0.0, 0.0)], 
      dtype=[('MSFT', '<f8'), ('CSCO', '<f8'), ('GOOG', '<f8')])

注意显示屏显示元组列表。这是故意的,以区分dtype记录与2d(普通)数组的行。

这也意味着在创建数组或分配值时,您还需要使用元组列表。

例如,让我们列出一个列表:

In [554]: ll = np.arange(9).reshape(3,3).tolist()
In [555]: ll

In [556]: A[:]=ll
...
TypeError: a bytes-like object is required, not 'list'

但如果我把它变成元组列表:

In [557]: llt = [tuple(i) for i in ll]

In [558]: llt
Out[558]: [(0, 1, 2), (3, 4, 5), (6, 7, 8)]

In [559]: A[:]=llt

In [560]: A
Out[560]: 
array([(0.0, 1.0, 2.0), (3.0, 4.0, 5.0), (6.0, 7.0, 8.0)], 
      dtype=[('MSFT', '<f8'), ('CSCO', '<f8'), ('GOOG', '<f8')])

分配工作正常。该列表也可以直接在array中使用。

In [561]: np.array(llt, dtype=dt)
Out[561]: 
array([(0.0, 1.0, 2.0), (3.0, 4.0, 5.0), (6.0, 7.0, 8.0)], 
      dtype=[('MSFT', '<f8'), ('CSCO', '<f8'), ('GOOG', '<f8')])

同样,为一条记录分配值需要一个元组,而不是一个列表:

In [563]: A[0]=(10,12,14)

设置值的另一种常用方法是逐个字段。这可以通过列表或数组来完成:

In [564]: A['MSFT']=[100,200,300]

In [565]: A
Out[565]: 
array([(100.0, 12.0, 14.0), (200.0, 4.0, 5.0), (300.0, 7.0, 8.0)], 
      dtype=[('MSFT', '<f8'), ('CSCO', '<f8'), ('GOOG', '<f8')])

另一个答案中建议的np.rec.fromarrays方法最终会使用逐字段方法。它的代码本质上是:

arrayList = [sb.asarray(x) for x in arrayList]
<determine shape>
<determine dtype>
_array = recarray(shape, descr)
# populate the record array (makes a copy)
for i in range(len(arrayList)):
    _array[_names[i]] = arrayList[i]

答案 1 :(得分:3)

如果您想要在保留列名的同时合并多个1D数组(列),则可以使用np.rec.fromarrays

>>> dt = np.dtype([('a', float),('b', float),('c', float),])
>>> np.rec.fromarrays([[0] * 3 ] * 3, dtype=dt)
rec.array([(0.0, 0.0, 0.0), (0.0, 0.0, 0.0), (0.0, 0.0, 0.0)], dtype=[('a', '<f8'), ('b', '<f8'), ('c', '<f8')])

这为您提供了一个记录/结构化数组,其中列可以具有名称&amp;不同的数据类型。