将字符串转换为浮于2D-numpy数组中

时间:2019-02-17 03:04:40

标签: python python-3.x numpy

我有一个以下函数combination()。它返回一个numpy数组'r'。在此2D数组中,第一列应为float。它以字符串形式返回。它尝试通过以下方式将列转换为浮点数。

RV = np.array([[0.23, 2.5 , 5.  , 7.1],['a', 'b'],['a1', 'a2']])

def combination():
    global r 
    r = np.array(np.meshgrid(*RV)).T.reshape(-1,len(RV)) 
    return r

combination()
print(r)

r[:,0] = r[:,0].astype(float) #convert string column to float
print(r)

2 个答案:

答案 0 :(得分:1)

Numpy数组本质上是同质的。如果要混合使用数据类型,可以使用列表将数据类型指定为numpy数组中的对象。

在两个数组中都添加了dtype = object。

import numpy as np
RV = np.array([[0.23, 2.5 , 5.  , 7.1],['a', 'b'],['a1', 'a2']])

def combination():
    global r
    r = np.array(np.meshgrid(*RV), dtype=object).T.reshape(-1,len(RV))
    return r

combination()
print(r)

编辑:对于“ RV”数组,您无需提及“ dtype = object”,因为它已经是。但是,在合并函数中为'r'np.array添加'dtype = object'将解决对其他任何将其转换回浮点数的后处理的需求。

答案 1 :(得分:1)

In [404]: RV = np.array([[0.23, 2.5 , 5.  , 7.1],['a', 'b'],['a1', 'a2']])
In [405]: RV
Out[405]: 
array([list([0.23, 2.5, 5.0, 7.1]), list(['a', 'b']), list(['a1', 'a2'])],
      dtype=object)

RV是一个对象dtype数组,因为列表的大小不同。它本质上是一个列表。实际上,给出使用方法后,不妨将其保留为列表。

In [406]: def combination(RV):
     ...:     r = np.array(np.meshgrid(*RV)).T.reshape(-1,len(RV)) 
     ...:     return r

In [407]: r = combination(RV)
In [408]: r
Out[408]: 
array([['0.23', 'a', 'a1'],
       ['0.23', 'b', 'a1'],
       ['2.5', 'a', 'a1'],
       ['2.5', 'b', 'a1'],
       ['5.0', 'a', 'a1'],
       ['5.0', 'b', 'a1'],
       ['7.1', 'a', 'a1'],
       ['7.1', 'b', 'a1'],
       ['0.23', 'a', 'a2'],
       ['0.23', 'b', 'a2'],
       ['2.5', 'a', 'a2'],
       ['2.5', 'b', 'a2'],
       ['5.0', 'a', 'a2'],
       ['5.0', 'b', 'a2'],
       ['7.1', 'a', 'a2'],
       ['7.1', 'b', 'a2']], dtype='<U32')

r是字符串dtype-全部。您可以转换列,但不能将浮点值放回r中(没有将它们转换回字符串)。

In [409]: r[:,0].astype(float)
Out[409]: 
array([0.23, 0.23, 2.5 , 2.5 , 5.  , 5.  , 7.1 , 7.1 , 0.23, 0.23, 2.5 ,
       2.5 , 5.  , 5.  , 7.1 , 7.1 ])

meshgrid在创建数组列表时保留dtype

In [410]: np.meshgrid(*RV)
Out[410]: 
[array([[[0.23, 0.23],
         [2.5 , 2.5 ],
         [5.  , 5.  ],
         [7.1 , 7.1 ]],

        [[0.23, 0.23],
         [2.5 , 2.5 ],
         [5.  , 5.  ],
         [7.1 , 7.1 ]]]), array([[['a', 'a'],
         ['a', 'a'],
         ['a', 'a'],
         ['a', 'a']],

        [['b', 'b'],
         ['b', 'b'],
         ['b', 'b'],
         ['b', 'b']]], dtype='<U1'), array([[['a1', 'a2'],
         ['a1', 'a2'],
         ['a1', 'a2'],
         ['a1', 'a2']],

        [['a1', 'a2'],
         ['a1', 'a2'],
         ['a1', 'a2'],
         ['a1', 'a2']]], dtype='<U2')]

但是,当您将它们包装在np.array中时,它将使用通用的兼容dtype字符串。您可以单独重塑该meshgrid列表中的元素:

In [411]: _[0].ravel()
Out[411]: 
array([0.23, 0.23, 2.5 , 2.5 , 5.  , 5.  , 7.1 , 7.1 , 0.23, 0.23, 2.5 ,
       2.5 , 5.  , 5.  , 7.1 , 7.1 ])

您是否完全了解制作对象dtype数组的后果?

顺便看看这个替代方案RV

In [416]: np.array([[0.23, 2.5],['a', 'b'],['a1', 'a2']])
Out[416]: 
array([['0.23', '2.5'],
       ['a', 'b'],
       ['a1', 'a2']], dtype='<U32')
In [417]: np.array([[0.23, 2.5],['a', 'b'],['a1', 'a2']],object)
Out[417]: 
array([[0.23, 2.5],
       ['a', 'b'],
       ['a1', 'a2']], dtype=object)

可靠地创建具有给定形状的对象dtype数组并非易事。