簡體   English   中英

ValueError:無法將字符串轉換為float ---如何將字符串列表轉換為numpy數組類型float?

[英]ValueError: could not convert string to float---how to convert a list of lists of strings into a numpy array type float?

看起來我在Python3.x中有一個格式錯誤的numpy數組-將其保存為字符串列表的列表。

foo = [[7.0352220e-01 5.3130367e-06 1.5167372e-05 1.0797821e-06]
  [1.3130367e-06 2.4584832e-01 2.2375602e-05 7.3299240e-06] [7.2646574e-06 7.1252006e-06 3.0184277e-01 ... 1.0048618e-05 3.1828706e-06 1.0196264e-06]..]

我收到以下錯誤,嘗試將np.float32數據np.float32入numpy數組:

np.asarray(foo, dtype=np.float32)

錯誤:

ValueError: could not convert string to float:[[7.0352220e-01 5.3130367e-06 1.5167372e-05 1.0797821e-06][1.3130367e-06 2.4584832e-01 2.2375602e-05 7.3299240e-06] [7.2646574e-06 7.1252006e-06 3.0184277e-01 ... 1.0048618e-05 3.1828706e-06 1.0196264e-06]..]

我嘗試將每個列表元素顯式轉換為float,如下所示:

try2 = np.asarray(map(np.float32, foo))

但它在支架上有障礙:

ValueError: could not convert string to float: [

建議將字符串列表轉換為numpy數組(類型為float)的建議方法是什么?

如果用逗號替換空格,則可以使用json.loads將該字符串作為列表讀取,並將其傳遞給np.asarray

import json
import numpy as np

foo = "[[7.0352220e-01 5.3130367e-06 1.5167372e-05 1.0797821e-06] \
[1.3130367e-06 2.4584832e-01 2.2375602e-05 7.3299240e-06]]"

a = np.asarray(json.loads(foo.replace(" ", ",")), dtype=np.float32)
print(a)
#array([[7.0352220e-01, 5.3130367e-06, 1.5167372e-05, 1.0797821e-06],
#       [1.3130367e-06, 2.4584832e-01, 2.2375602e-05, 7.3299240e-06]])

print(a.dtype)
#float32

假定值之間恰好有1個空格。 如果不是這種情況,則可以使用re.sub將多個空格替換為逗號:

import re
a = np.asarray(json.loads(re.sub("\s+", ",", foo)))
#array([[7.0352221e-01, 5.3130366e-06, 1.5167372e-05, 1.0797821e-06],
#       [1.3130367e-06, 2.4584831e-01, 2.2375601e-05, 7.3299238e-06]],
#      dtype=float32)

據我所知, 僅當 dtype的數據類型與初始數據類型不同時,np.asarray()才起作用。 請嘗試刪除該參數,看看是否可行。

字符串數據的形狀如何? 可能最簡單的方法是使用split()並遍歷列表。 適用於我的示例(字符串列表列表):

foo = [['7.0352220e-01 5.3130367e-06 1.5167372e-05 1.0797821e-06'],
       ['7.0352220e-01 5.3130367e-06 1.5167372e-05 1.0797821e-06']]
arr = np.array([[value.split() for value in row][0] for row in foo], dtype='<f8')

(注意:[0]用作拆分本身會創建一個列表。您可以使用np.reshape替代方法)

編輯:如果它是字符串表示形式(不是OP中所述的字符串列表):

foo = '[[7.0352220e-01 5.3130367e-06 1.5167372e-05 1.0797821e-06][7.0352220e-01 5.3130367e-06 1.5167372e-05 1.0797821e-06]'
arr=np.array([line.split() for line in foo.replace('[','').replace(']]','').split(']')], dtype='<f8')

鑒於:

foo = [['7.0352220e-01 5.3130367e-06 1.5167372e-05 1.0797821e-06'],
       ['1.3130367e-06 2.4584832e-01 2.2375602e-05 7.3299240e-06'], 
       ['7.2646574e-06 7.1252006e-06 3.0184277e-01 1.0048618e-05']]

試試這個拆分每個字符串

foo = [row[i].split() for row in foo for i in range(len(foo[0]))]

這種改變類型為浮動。

foo = [[float(row[i]) for i in range(len(foo[0]))] for row in foo]

print(type(foo[0][1]))

>> float

然后將其轉換為一個numpy數組:

foo = np.array(foo)

print(type(foo[0][1]))

>> numpy.float64

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM