我有两个不同的数组,一个带有字符串,另一个带有整数。我想将它们连接成一个数组,其中每一列都具有原始数据类型。我当前执行此操作的解决方案(请参见下文)将整个数组转换为dtype = string,这似乎在内存方面效率很低。
combined_array = np.concatenate((A, B), axis = 1)
combined_array何时A.dtype = string和何时可能使dtypes多元化B.dtype = int?
combined_array
A.dtype = string
B.dtype = int
一种方法可能是使用记录数组。“列”与标准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'