转换为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对象

将CV2 numpy数组转换为QImage时如何配置颜色?

通过 sql developer 导入 csv 时,单引号被转换为 2 个单引号

如何将包含单引号和双引号值的 Python 列表转换为所有双引号值

如何将numpy数组转换为keras张量