为了账号安全,请及时绑定邮箱和手机立即绑定

将字符串 numpy.ndarray 转换为浮点 numpy.ndarray

将字符串 numpy.ndarray 转换为浮点 numpy.ndarray

杨魅力 2022-01-05 19:18:09
我有一个问题。我该如何转换:import numpy as npa = np.array([['0.1 0.2 0.3'], ['0.3 0.4 0.5'], ['0.5 0.6 0.7']])到:b = np.array([[0.1,0.2,0.3], [0.3,0.4,0.5], [0.5,0.6,0.7]])
查看完整描述

3 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

这是一种可能的方法:

import numpy as np

a = np.array([['0.1 0.2 0.3'], ['0.3 0.4 0.5'], ['0.5 0.6 0.7']])


# Create a placeholder list

b = []


for element in a:

  # use a list comprehension to

  #     * take the zeroeth element in each row of the 'a' array and

  #       split the string on spaces

  #     * parse through each substring thus produced

  #     * convert each of those substrings into floats

  #     * store it in the list called temp.


  temp = [float(num) for num in element[0].split()]


  # Add each temp list to the parent list 'b'

  b.append(temp)


# Convert b into an np.array

b = np.array(b)

没有评论

这看起来像这样:


b = []


for element in a:

    temp = [float(num) for num in element[0].split(' ')]

    b.append(temp)

b = np.array(b)

产量:

array([[0.1, 0.2, 0.3],

       [0.3, 0.4, 0.5],

       [0.5, 0.6, 0.7]])

另一种方法:

我倾向于将其作为一种方法,因为它使用 numpy 的本机投射能力。我还没有测试过它,但如果这会在大型数组的转换过程中产生加速,我不会感到惊讶。


# transform 'a' to an array of rows full of individual strings

# use the .astype() method to then cast each value as a float

a = np.array([row[0].split() for row in a])

b = a.astype(np.float)


查看完整回答
反对 回复 2022-01-05
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

我将这个答案留给正在寻找矢量化 NumPy 方法的人的参考。TL; DR:它并不快,np.array([row[0].split() for row in a], dtype=float)在接受的答案中使用。


我正在寻找解决此问题的矢量化方法,并提出了以下解决方案。


使用np.char.split:


import numpy as np



def to_numeric1(array, sep=' ', dtype=np.float):

    """

    Converts an array of strings with delimiters in it 

    to an array of specified type

    """

    split = np.char.split(array, sep=sep)

    without_lists = np.array(split.tolist())

    corrected_dimension = np.squeeze(without_lists)

    return corrected_dimension.astype(dtype)

并使用pd.Series.str.split:


import pandas as pd



def by_pandas(array, sep=' ', dtype=np.float):

    df = pd.DataFrame(array)

    return df[0].str.split(pat=sep, expand=True).to_numpy(dtype=dtype)

不幸的是,这两种解决方案都比E. Ducateme 的答案中的原生 Python 循环慢:


a = np.array([['0.1 0.2 0.3'], ['0.3 0.4 0.5'], ['0.5 0.6 0.7']]*10000)


%%timeit

native_python_loop(a)

# 57.8 ms ± 526 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)


%%timeit

to_numeric1(a)

# 86.6 ms ± 122 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)


%%timeit

to_numeric2(a)

# 79.8 ms ± 1.11 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

正如hpaulj的评论所述:


这些np.char函数将 Python 字符串方法应用于数组的每个元素。它们是一种便利,但并不能提高速度。NumPy 没有对字符串内容进行操作的快速编译代码。这取决于现有的 Python 代码。字符串不存在普通数字意义上的“向量化”。


理想情况下,第一个解决方案可以与本机 Python 循环一样快,并且代码行更少。问题在于返回值np.char.split:


>>> a = np.array([['0.1 0.2 0.3'], ['0.3 0.4 0.5'], ['0.5 0.6 0.7']])

>>> np.char.split(a)

array([[list(['0.1', '0.2', '0.3'])],

       [list(['0.3', '0.4', '0.5'])],

       [list(['0.5', '0.6', '0.7'])]], dtype=object)

它返回一个 NumPy 字符串列表的 NumPy 数组,这些字符串列表应该被进一步处理为一个普通的 2D NumPy 数组,我假设这个处理需要很多时间。正如hpaulj 所说:“[i.split() for i in a]并且np.char.split(a)需要基本上相同的时间”


GitHub 上有一个问题建议对此函数进行更改,因此它将返回以下内容:


array([['0.1', '0.2', '0.3'],

       ['0.3', '0.4', '0.5'],

       ['0.5', '0.6', '0.7']], dtype='<U3')


查看完整回答
反对 回复 2022-01-05
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

b = []

for ai in a:

  temp=[]

  for b in ai[0].split(' '):

     temp.append(float(b))

  b.append(temp)


b = np.array(b)

您遍历所有字符串,将它们拆分为一个空格,然后将它们类型转换为浮动


查看完整回答
反对 回复 2022-01-05
  • 3 回答
  • 0 关注
  • 808 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信