Numpy:在column_stack()之后保留dtype

时间:2016-03-26 22:40:09

标签: python numpy

python3,numpy1.10

让我们说,我有类似

的东西

some_array = ['a', 'b', 'c'] bool_array = numpy.array([False for x in range(len(parts_array))], dtype='bool_')

然后bool_array将为[False, False, False]并且bool类型。

当我这样做的时候 another_array = numpy.column_stack((some_array, bool_array)),这两种类型都成为str,我不想这样做。 我想要的是在第二列中保留bool类型。我不在乎第一栏的类型。

我需要创建另一个数组吗?似乎解决方案是通过structured arrays中的dtype,但我不想复制column_stack()生成的整个数组。

2 个答案:

答案 0 :(得分:0)

我认为你不能在一个numpy数组中拥有多种数据类型。例如,如果你有

,你可能想尝试一个pandas数据框
  some_array=['a','b','c']
  bool_array=[False, False, Fale] 

您可以定义数据框

 df=pd.DataFrame(bool_array, index=some_array.tolist(), columns=[1])

这就像

    1
 a  False
 b  False
 c  False

bool_array将保留其类型,但您必须使用数据框操作来访问和操作它

答案 1 :(得分:0)

有两种(主要)方法可以将值添加到结构化数组中 - 使用元组列表或将值复制到每个字段。

e.g。按字段:

In [368]: arr=np.zeros((3,),dtype='S10,bool')
In [369]: arr
Out[369]: 
array([(b'', False), (b'', False), (b'', False)], 
      dtype=[('f0', 'S10'), ('f1', '?')])
In [371]: arr['f0']=['one','two','three']
In [372]: arr['f1']=[True,False,True]
In [373]: arr
Out[373]: 
array([(b'one', True), (b'two', False), (b'three', True)], 
      dtype=[('f0', 'S10'), ('f1', '?')])

如果您有一个子列表列表,则需要将子列表转换为元组:

In [378]: alist=[['one',True],['two',False],['three',True]]
In [379]: np.array([tuple(i) for i in alist], dtype=arr.dtype)
Out[379]: 
array([(b'one', True), (b'two', False), (b'three', True)], 
      dtype=[('f0', 'S10'), ('f1', '?')])

column_stack作为中间数组无效,因为它丢失了原始列dtypes。

您还可以在from numpy.lib import recfunctions中探索功能。该模块具有合并数组的功能。但是我看过的那些使用了字段复制方法,所以它们不会节省任何时间。

In [381]: recfunctions.merge_arrays([['one','two','three'],[False,True,False]])
Out[381]: 
array([('one', False), ('two', True), ('three', False)], 
      dtype=[('f0', '<U5'), ('f1', '?')])