更改结构化/记录数组的数据类型

2 投票
1 回答
2237 浏览
提问于 2025-04-17 05:15

问题1:在把一列数据转换成不同的数据类型时,使用np.array还是np.astype更好呢?我看到很多例子用的是np.astype,但这两者似乎都能得到想要的结果(都是返回原数组的副本)。

import numpy as np

## recasting string to integer
x = np.rec.array([('a','1'),('b','2')],names='col1,col2')
##
In []: x
Out[]: 
rec.array([('a', '1'), ('b', '2')], 
      dtype=[('col1', '|S1'), ('col2', '|S1')])
##
dt = x.dtype.descr
dt[1] = (dt[1][0],'int')
## which is more appropriate:
y = np.array(x,dtype=dt)
## or
y = x.astype(dt)
## ?
In []: y
Out[]: 
rec.array([('a', 1), ('b', 2)], 
      dtype=[('col1', '|S1'), ('col2', '<i4')])

问题2:重命名列的时候,使用np.array时整数列的值变成了零,但用np.rec.array时值却保留了。为什么会这样?我理解的是,前者生成的是结构化数组,而后者返回的是记录数组;我以为这两者在大多数情况下是一样的。这个行为让我感到很惊讶,无论如何。

## rename 2nd column from col2 to v2
dt = copy.deepcopy(y.dtype)
names = list(dt.names)
names[1] = 'v2'
dt.names = names
## this is not right
newy = np.array(y,dtype=dt)
In []: newy
Out[]: 
array([('a', 0), ('b', 0)], 
      dtype=[('col1', '|S1'), ('v2', '<i4')])
## this is correct
newy = np.rec.array(y,dtype=dt)
In []: newy
Out[]: 
rec.array([('a', 1), ('b', 2)], 
      dtype=[('col1', '|S1'), ('v2', '<i4')])

1 个回答

3

问题1: 使用 np.arraynp.astype 这两种方法实际上做的是一样的事情,内部原理也是相同的。不过,使用 np.astype 的时候,输入的内容会少一些,而且读起来更清楚,能让人明白你是想要改变数据类型。

撰写回答