在一个 NumPy 数组中存储不同的数据类型?
Posted
技术标签:
【中文标题】在一个 NumPy 数组中存储不同的数据类型?【英文标题】:Store different datatypes in one NumPy array? 【发布时间】:2012-07-03 19:34:37 【问题描述】:我有两个不同的数组,一个是字符串,另一个是整数。我想将它们连接成一个数组,其中每一列都具有原始数据类型。我目前的解决方案(见下文)将整个数组转换为 dtype = string,这似乎非常低效。
combined_array = np.concatenate((A, B), axis = 1)
当A.dtype = string
和B.dtype = int
时,是否可以在combined_array
中使用多种数据类型?
【问题讨论】:
问题是关于使用 NumPy 数组。但是,如果 NumPy 数组不是必需的,那么 Pandas DataFrame 将适用于这种情况。 【参考方案1】:一种方法可能是使用record array。 “列”不会像标准 numpy 数组的列,但对于大多数用例来说,这就足够了:
>>> a = numpy.array(['a', 'b', 'c', 'd', 'e'])
>>> b = numpy.arange(5)
>>> records = numpy.rec.fromarrays((a, b), names=('keys', 'data'))
>>> records
rec.array([('a', 0), ('b', 1), ('c', 2), ('d', 3), ('e', 4)],
dtype=[('keys', '|S1'), ('data', '<i8')])
>>> records['keys']
rec.array(['a', 'b', 'c', 'd', 'e'],
dtype='|S1')
>>> records['data']
array([0, 1, 2, 3, 4])
请注意,您也可以通过指定数组的数据类型来对标准数组执行类似的操作。这被称为“structured array”:
>>> arr = numpy.array([('a', 0), ('b', 1)],
dtype=([('keys', '|S1'), ('data', 'i8')]))
>>> arr
array([('a', 0), ('b', 1)],
dtype=[('keys', '|S1'), ('data', '<i8')])
不同之处在于记录数组还允许对单个数据字段进行属性访问。标准结构化数组没有。
>>> records.keys
chararray(['a', 'b', 'c', 'd', 'e'],
dtype='|S1')
>>> arr.keys
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'numpy.ndarray' object has no attribute 'keys'
【讨论】:
arr = np.array([('cat', 5), ('dog', 20)], dtype=[('name', np.object), ('age',np.int)])
name 列可以通过结构化数组中的 arr['name'] 访问【参考方案2】:
一个简单的解决方案:将您的数据转换为对象 'O' 类型
z = np.zeros((2,2), dtype='U2')
o = np.ones((2,1), dtype='O')
np.hstack([o, z])
创建数组:
array([[1, '', ''],
[1, '', '']], dtype=object)
【讨论】:
如果你真的想对该数组的切片进行任何有意义的操作,这会导致各种问题。 什么样的问题? @Astrid 你能详细说说你的想法吗? 假设,为了论证,你把它变成了一个数据框。然后你想过滤那个数据框中的对象,比如df.loc[(df.col == item)]
,这是行不通的,因为当 pandas 进行过滤时,它希望所有项目都属于同一类型。因此,例如,如果您要在同一列中混合字符串和整数,那么您将有效地比较苹果和橙子。因此 pandas 会抛出一个错误。【参考方案3】:
参考Numpy doc,有一个名为numpy.lib.recfunctions.merge_arrays
function的函数,可用于将不同数据类型的numpy数组合并为结构化数组或记录数组。
例子:
>>> from numpy.lib import recfunctions as rfn
>>> A = np.array([1, 2, 3])
>>> B = np.array(['a', 'b', 'c'])
>>> b = rfn.merge_arrays((A, B))
>>> b
array([(1, 'a'), (2, 'b'), (3, 'c')], dtype=[('f0', '<i4'), ('f1', '<U1')])
更多详情请参考上面的链接。
【讨论】:
以上是关于在一个 NumPy 数组中存储不同的数据类型?的主要内容,如果未能解决你的问题,请参考以下文章
如何将不同类型的数据从文件导入 Python Numpy 数组?
python-数据处理的包Numpy,scipy,pandas,matplotlib
将制表符分隔的 csv 读入具有不同数据类型的 numpy 数组