转换为numpy数组时,如何消除单引号? (python3)
Posted
技术标签:
【中文标题】转换为numpy数组时,如何消除单引号? (python3)【英文标题】:When converting to a numpy array, how can eliminate the single quotation marks? (python3) 【发布时间】:2022-01-21 19:24:47 【问题描述】:我想要这个
array([[2600, 11749, 9], [976, 16, 2, ...],...)
但我不知道为什么要打印单引号。我该怎么办?
【问题讨论】:
您是如何创建阵列的?看起来您有一个包含一堆列表的字符串表示形式的列表,您希望在其中拥有一个列表列表。 @Blckknght 列中的元素类型为str。但是,它仅由整数组成。我想制作一个列表列表,但我不知道该怎么做。 那些引用不是轻浮的装饰。他们告诉你框架实际上包含什么——字符串,而不是列表。我的猜测是你从csv
文件中加载了这个框架。您需要查看文件,如果可能,还需要查看原始数据框。
【参考方案1】:
看起来X_train
是一个pandas
数据框。很难从框架显示中分辨出像您这样的列包含什么 - 它真的是数组吗? np.array(X_train)
告诉我们不,它包含看起来像数组的字符串。 X_train.to_numpy()
是从帧中提取数组的首选方式,但我认为结果会是一样的。
根据过去的 SO 问题,我的猜测是,最初您有一个框架,其中包含列中的数组。然后你把它保存为csv
,然后重新加载它。因为csv
本质上是二维格式,所以pandas
必须写入字符串,而不是数组。这就是你得到的。
查看来源csv
。
虽然可以将这些字符串转换为数组(前提是它们不包含...
),但这并非易事。许多以前的SO都提出了建议,但我会让其他人找到相关的重复项。
即使您成功地将字符串转换为数组,该帧仍将包含长度可变的数组,这意味着生成的数组仍将是object
dtype,即包含可变长度数组的数组。它不会是二维数字 dtype 数组。
名称X_train
表明您希望将此数据用于某种形式的机器学习。大多数(如果不是全部)这些方法都需要大小一致的数据。数组应该具有类似[batch, samples, features]
的形状。他们不能“衣衫褴褛”。
制作框架:
In [24]: df = pd.DataFrame([None,None,None],columns=['one'])
In [25]: df
Out[25]:
one
0 None
1 None
2 None
In [29]: df['one'] = [np.ones(5),np.arange(4),np.zeros(9)]
In [30]: df
Out[30]:
one
0 [1.0, 1.0, 1.0, 1.0, 1.0]
1 [0, 1, 2, 3]
2 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
一个参差不齐的数组:
In [31]: df.to_numpy()
Out[31]:
array([[array([1., 1., 1., 1., 1.])],
[array([0, 1, 2, 3])],
[array([0., 0., 0., 0., 0., 0., 0., 0., 0.])]], dtype=object)
制作一个 csv 并返回:
In [32]: df.to_csv('test')
In [33]: df1 = pd.read_csv('test')
In [34]: df1
Out[34]:
Unnamed: 0 one
0 0 [1. 1. 1. 1. 1.]
1 1 [0 1 2 3]
2 2 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
请注意显示与 [30] 的相同之处。但是数组和你的一样:
In [35]: df1.to_numpy()
Out[35]:
array([[0, '[1. 1. 1. 1. 1.]'],
[1, '[0 1 2 3]'],
[2, '[0. 0. 0. 0. 0. 0. 0. 0. 0.]']], dtype=object)
csv
看起来与框架相同 - 没有引号。但 csv 阅读器无法解析 []
部分。它只是用逗号分隔测试。
In [36]: cat test
,one
0,[1. 1. 1. 1. 1.]
1,[0 1 2 3]
2,[0. 0. 0. 0. 0. 0. 0. 0. 0.]
但是等等,[34] 没有逗号。那是因为源框架有列表,而不是数组。
In [37]: df['one'] = [np.ones(5).tolist(),np.arange(4).tolist(),np.zeros(9).toli
...: st()]
In [38]: df
Out[38]:
one
0 [1.0, 1.0, 1.0, 1.0, 1.0]
1 [0, 1, 2, 3]
2 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
In [39]: df.to_numpy()
Out[39]:
array([[list([1.0, 1.0, 1.0, 1.0, 1.0])],
[list([0, 1, 2, 3])],
[list([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])]],
dtype=object)
In [40]: df.to_csv('test')
In [41]: cat test
,one
0,"[1.0, 1.0, 1.0, 1.0, 1.0]"
1,"[0, 1, 2, 3]"
2,"[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]"
In [42]: df1 = pd.read_csv('test')
In [43]: df1
Out[43]:
Unnamed: 0 one
0 0 [1.0, 1.0, 1.0, 1.0, 1.0]
1 1 [0, 1, 2, 3]
2 2 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
In [44]: df1.to_numpy()
Out[44]:
array([[0, '[1.0, 1.0, 1.0, 1.0, 1.0]'],
[1, '[0, 1, 2, 3]'],
[2, '[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]']], dtype=object)
将这样的字符串转换为列表很容易 - 只需在每个字符串上使用 eval
。
【讨论】:
【参考方案2】:看起来X_train
中的每一行都是一个字符串而不是一个列表,所以我认为您需要将这些字符串转换为列表。我认为应该这样做:
X_train = pd.Series([[int(x) for x in string.strip('[]').split(',')] for string in X_train.tolist()])
【讨论】:
【参考方案3】:好像pandas系列中已经输入了不同长度的numpy数组。
好像pandas系列中已经输入了不同长度的numpy数组。
试试这个
X_train.values
或
list(map(np.array, x_train))
【讨论】:
以上是关于转换为numpy数组时,如何消除单引号? (python3)的主要内容,如果未能解决你的问题,请参考以下文章
当字符串在双引号内有单引号时,如何在Javascript中将此字符串转换为JSON对象
通过 sql developer 导入 csv 时,单引号被转换为 2 个单引号