python - 将字符串转换为二维 numpy 数组中的 float

标签 python python-3.x numpy

我有一个以下函数组合()。它返回一个 numpy 数组“r”。在这个二维数组中,第一列应该是 float 。它将它作为字符串返回。它尝试通过以下方式将列转换为 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)

最佳答案

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 是一个对象数据类型数组,因为列表的大小各不相同。它本质上是一个列表。事实上,给出你如何使用它,你不妨将其保留为一个列表。

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 是一个字符串数据类型 - 全部。您可以转换列,但无法将浮点值放回 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 中时,它使用常见的兼容数据类型,字符串。您可以单独 reshape 该 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 ])

您完全了解创建对象数据类型数组的后果吗?

顺便说一下,看看这个替代的 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)

可靠地创建具有给定形状的对象数据类型数组并不是一项简单的任务。

关于python - 将字符串转换为二维 numpy 数组中的 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54729754/

相关文章:

numpy - 从Pyspark Dataframe提取numpy数组

numpy - numpy中的高精度计算

python - 如何将应用程序包装端点添加到 Restplus API 文档?

python - scipy 插值没有平滑我的数据

python - 具有多个元素的 Django __str__

Python 3 asyncio - yield from vs asyncio.async 堆栈使用

python - 带有 *args 的 lambda 表达式

python - 在嵌套字典 python 中搜索值

python - 删除 Pandas 系列中的空列表

python - 有效地按降序对numpy数组进行排序?