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

我有一个问题。我该如何转换:


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']])

到:


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


杨魅力
浏览 809回答 3
3回答

胡说叔叔

这是一种可能的方法:import numpy as npa = np.array([['0.1 0.2 0.3'], ['0.3 0.4 0.5'], ['0.5 0.6 0.7']])# Create a placeholder listb = []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.arrayb = 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 floata = np.array([row[0].split() for row in a])b = a.astype(np.float)

吃鸡游戏

我将这个答案留给正在寻找矢量化 NumPy 方法的人的参考。TL; DR:它并不快,np.array([row[0].split() for row in a], dtype=float)在接受的答案中使用。我正在寻找解决此问题的矢量化方法,并提出了以下解决方案。使用np.char.split:import numpy as npdef to_numeric1(array, sep=' ', dtype=np.float):&nbsp; &nbsp; """&nbsp; &nbsp; Converts an array of strings with delimiters in it&nbsp;&nbsp; &nbsp; to an array of specified type&nbsp; &nbsp; """&nbsp; &nbsp; split = np.char.split(array, sep=sep)&nbsp; &nbsp; without_lists = np.array(split.tolist())&nbsp; &nbsp; corrected_dimension = np.squeeze(without_lists)&nbsp; &nbsp; return corrected_dimension.astype(dtype)并使用pd.Series.str.split:import pandas as pddef by_pandas(array, sep=' ', dtype=np.float):&nbsp; &nbsp; df = pd.DataFrame(array)&nbsp; &nbsp; 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)%%timeitnative_python_loop(a)# 57.8 ms ± 526 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)%%timeitto_numeric1(a)# 86.6 ms ± 122 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)%%timeitto_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'])],&nbsp; &nbsp; &nbsp; &nbsp;[list(['0.3', '0.4', '0.5'])],&nbsp; &nbsp; &nbsp; &nbsp;[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'],&nbsp; &nbsp; &nbsp; &nbsp;['0.3', '0.4', '0.5'],&nbsp; &nbsp; &nbsp; &nbsp;['0.5', '0.6', '0.7']], dtype='<U3')

一只斗牛犬

b = []for ai in a:&nbsp; temp=[]&nbsp; for b in ai[0].split(' '):&nbsp; &nbsp; &nbsp;temp.append(float(b))&nbsp; b.append(temp)b = np.array(b)您遍历所有字符串,将它们拆分为一个空格,然后将它们类型转换为浮动
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python