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)
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')
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)
您遍历所有字符串,将它们拆分为一个空格,然后将它们类型转换为浮动
添加回答
举报