在一个 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 = stringB.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_arraysfunction的函数,可用于将不同数据类型的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 数组

Python中既有列表,何必再有数组(NumPy‘s ndarray)?

数据分析之numpy

python中的list和array的不同之处