将字符串numpy.ndarray转换为float numpy.ndarray

时间:2019-04-10 08:01:09

标签: python numpy 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]])

5 个答案:

答案 0 :(得分:1)

我将这个答案留给正在寻找矢量化NumPy方法的人参考。 TL; DR:速度不快,请像the accepted answer中那样使用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's answer中的原生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)

comment by 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 said:“ [i.split() for i in a]np.char.split(a)花费的时间基本相同

有一个issue on GitHub建议对此功能进行更改,因此它将返回以下内容:

array([['0.1', '0.2', '0.3'],
       ['0.3', '0.4', '0.5'],
       ['0.5', '0.6', '0.7']], dtype='<U3')

答案 1 :(得分:0)

b = []
for ai in a:
  temp=[]
  for b in ai[0].split(' '):
     temp.append(float(b))
  b.append(temp)

b = np.array(b)

您遍历所有字符串,将它们分割在一个空格上,并进行类型转换以使其浮动

答案 2 :(得分:0)

这是一种可能的方法:

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)

向@ahmed_yousif求婚

答案 3 :(得分:0)

您可以使用嵌套列表进行操作,然后重塑它们。

b = [ float(h) for j in [i[0].split(" ") for i in a  ]for h in j ]
b = np.asarray(b).reshape(3,3)

希望这会有所帮助。

@E。 Ducateme解决方案也非常压缩。

答案 4 :(得分:0)

首先,您将通过将数组中的每个项目吐入float字符串中来进行映射,然后应用x.astype(np.float)函数将其转换为float

import  numpy as np

x = np.array([['0.1 0.2 0.3'], ['0.3 0.4 0.5'], ['0.5 0.6 0.7']])    
x = np.array(list(map(lambda z: z[0].split(),x)))
y = x.astype(np.float)
print(y)

结果:

[[0.1 0.2 0.3]
 [0.3 0.4 0.5]
 [0.5 0.6 0.7]]