Skip to main content
 首页 » 编程设计

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

2025年05月04日14me-sa

为什么以下内容有效:

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

虽然这不是:

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

TypeError: expected a readable buffer object

我怎样才能像这样轻松地创建一个矩阵

[[None]*M]*N

但是其中包含元组以便能够为列分配名称?

请您参考如下方法:

当我用你的数据类型创建一个零数组时

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 记录与二维(普通)数组的一行区分开来。

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

例如,让我们制作一个列表列表:

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]