将不同的数据类型存储在一个NumPy数组中?

veo*_*eor 43 python arrays types numpy

我有两个不同的数组,一个是字符串,另一个是整数.我想将它们连接到一个数组中,其中每列都具有原始数据类型.我目前的解决方案(见下文)将整个数组转换为dtype = string,这看起来非常低效.

combined_array = np.concatenate((A, B), axis = 1)

是否有可能多发dtypes的combined_array时候A.dtype = stringB.dtype = int

sen*_*rle 37

一种方法可能是使用记录数组."列"不会像标准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])
Run Code Online (Sandbox Code Playgroud)

请注意,您还可以通过指定数组的数据类型来执行与标准数组类似的操作.这被称为" 结构化阵列 ":

>>> arr = numpy.array([('a', 0), ('b', 1)], 
                      dtype=([('keys', '|S1'), ('data', 'i8')]))
>>> arr
array([('a', 0), ('b', 1)], 
      dtype=[('keys', '|S1'), ('data', '<i8')])
Run Code Online (Sandbox Code Playgroud)

不同之处在于记录数组还允许对各个数据字段进行属性访问.标准结构化数组没有.

>>> 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'
Run Code Online (Sandbox Code Playgroud)

  • `arr = np.array([('cat', 5), ('dog', 20)], dtype=[('name', np.object), ('age',np.int)])` name 列可以通过结构化数组中的 arr['name'] 访问 (2认同)

ast*_*key 10

一个简单的解决方案:将您的数据转换为对象“O”类型

z = np.zeros((2,2), dtype='U2')
o = np.ones((2,1), dtype='O')
np.hstack([o, z])
Run Code Online (Sandbox Code Playgroud)

创建数组:

array([[1, '', ''],
       [1, '', '']], dtype=object)
Run Code Online (Sandbox Code Playgroud)

  • 出于争论的目的,假设您将其转换为数据框。然后你想过滤该数据框中的对象,比如“df.loc[(df.col == item)]”,但这行不通,因为当 pandas 进行过滤时,它期望所有项目都具有相同的类型。因此,例如,如果您要在同一列中混合字符串和整数,那么您将有效地比较苹果和橙子。因此 pandas 会抛出错误。 (5认同)
  • 如果您真的想对该数组的切片执行任何有意义的操作,这会导致各种问题。 (4认同)
  • 什么样的问题? (3认同)