Python 使用混合类型连接数组

Python 使用混合类型连接数组,python,numpy,Python,Numpy,考虑np.arraya a = np.concatenate( [np.arange(2).reshape(-1, 1), np.array([['a'], ['b']])], axis=1) a array([['0', 'a'], ['1', 'b']], dtype='|S11') 如何执行此串联,使a的第一列保持整数?您可以使用numpy.object作为dtype在numpy数组中混合类型: >>> impor

考虑
np.array
a

a = np.concatenate(
    [np.arange(2).reshape(-1, 1),
     np.array([['a'], ['b']])],
    axis=1)
a

array([['0', 'a'],
       ['1', 'b']], 
      dtype='|S11')

如何执行此串联,使
a
的第一列保持整数?

您可以使用
numpy.object
作为
dtype
在numpy数组中混合类型:

>>> import numpy as np
>>> a = np.empty((2, 0), dtype=np.object)
>>> a = np.append(a, np.arange(2).reshape(-1,1), axis=1)
>>> a = np.append(a, np.array([['a'],['b']]), axis=1)
>类型(a[0,0])
>类型(a[0,1])

建议的副本建议进行重新排列或结构化数组

在这种情况下:

In [324]: a = np.rec.fromarrays((np.arange(2).reshape(-1,1), np.array([['a'],['b']])))
In [325]: a
Out[325]: 
rec.array([[(0, 'a')],
 [(1, 'b')]], 
          dtype=[('f0', '<i4'), ('f1', '<U1')])
In [326]: a['f0']
Out[326]: 
array([[0],
       [1]])
In [327]: a['f1']
Out[327]: 
array([['a'],
       ['b']], 
      dtype='<U1')
[324]中的
:a=np.rec.fromrarrays((np.arange(2).重塑(-1,1),np.array(['a'],['b']]))
在[325]中:a
出[325]:
rec.array([[(0,'a')],
[(1,'b')]],

数据类型=[('f0','You','You'不能。numpy数组是同质的。每个数组都有一个元素类型。@Bakuriu是的,但该类型可以是
numpy.object
duplicate'描述了一种不同的方法-使用recarray或结构化数组。结果将是一个具有2个字段的1d数组,而不是一个2d数组。这取决于您还需要对请注意,虽然单个元素是整数,但列本身将是一个numpy对象;也就是说,如果您明确希望切片是整数数组,则需要在调用时显式转换类型,例如
np.array(a[:,0],dtype=np.int64)
谢谢@hpaulj;我承认我在给出答案时忽略了先检查重复项;不过很高兴它增加了一些好处。写答案通常比寻找重复项更容易(更快)。但有时候侧边栏能很好地找到重复项。
>>> type(a[0,0])
<type 'int'>
>>> type(a[0,1])
<type 'str'>
In [324]: a = np.rec.fromarrays((np.arange(2).reshape(-1,1), np.array([['a'],['b']])))
In [325]: a
Out[325]: 
rec.array([[(0, 'a')],
 [(1, 'b')]], 
          dtype=[('f0', '<i4'), ('f1', '<U1')])
In [326]: a['f0']
Out[326]: 
array([[0],
       [1]])
In [327]: a['f1']
Out[327]: 
array([['a'],
       ['b']], 
      dtype='<U1')