我有一个问题。如何转换:
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]])
答案 0 :(得分:1)
我将这个答案留给正在寻找矢量化NumPy方法的人参考。 TL; DR:速度不快,请像the accepted answer中那样使用np.array([row[0].split() for row in a], dtype=float)
。
我一直在寻找针对此问题的矢量化方法,并提出了以下解决方案。
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)
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]]