在一个 NumPy 数组中存储不同的数据类型?
- 2025-02-05 13:23:00
- admin 原创
- 71
问题描述:
我有两个不同的数组,一个包含字符串,另一个包含整数。我想将它们连接成一个数组,其中每列都具有原始数据类型。我目前的解决方案(见下文)是将整个数组转换为 dtype = string,这似乎非常浪费内存。
combined_array = np.concatenate((A, B), axis = 1)
combined_array
在何时A.dtype = string
和中是否有可能存在多种数据类型B.dtype = int
?
解决方案 1:
一种方法可能是使用记录数组。“列”不会像标准 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])
请注意,您也可以通过指定数组的数据类型对标准数组执行类似操作。这称为“结构化数组”:
>>> 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'
解决方案 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)
解决方案 3:
参考Numpy 文档,有一个名为 function 的函数numpy.lib.recfunctions.merge_arrays
可用于将不同数据类型的 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')])
欲了解更多详情,请参阅上面的链接。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD