【问题标题】:Convert a list of 1x1 dimensional arrays to list of floats in python将 1x1 维数组列表转换为 python 中的浮点列表
【发布时间】:2019-01-10 18:52:10
【问题描述】:

我有一个表格列表:

[array([ 3755.16235032]),
 array([ 3755.16235032]),
 array([ 3755.16235032]),
 array([ 3755.16235032])]

我想要一份表格清单:

[3755.16235032,
 3755.16235032,
 3755.16235032,
 3755.16235032]

第一个列表的每个元素都是 sci kit learn regressor 的结果。我想要第二种格式,所以我可以绘制分类器的预测。

【问题讨论】:

  • [x[0] for x in array]?
  • 您确定不希望它作为一维浮点数组而不是浮点列表吗?你可以这样做,例如,np.array(lst).flatten()np.concatenate(lst) 来获得一个平面数组。
  • (如果你真的想要一个列表,你也可以使用list(np.array(lst).flatten()),它可能会比listcomp稍微快一点……但是对于N=4,谁在乎呢?)

标签: python arrays list pandas


【解决方案1】:

只是替代解决方案:鉴于 x 是您的输入 list,您可以使用 NumPy 中的 ravel() 作为

xlst = list(np.array(x).ravel())
print (xlst)

或者你可以使用flatten()作为

xlst = list(np.array(x).flatten())
print (xlst)

如果您只想将最终答案作为一个数组,则无需将list 放在= 之后。并且,如果您的输入 x 已经是 numpy 数组类型,请将 np.array(x).ravel() 替换为 x.ravel()

或者,正如上面答案中已经提到的,您也可以使用np.array(x).flatten().tolist()np.array(x).ravel().tolist(),而不是使用list() 转换为列表

对本页上列出的所有可能答案进行一些时间分析,灵感来自以下答案之一中的 cmets(感谢评论员)(由于格式问题,很容易将其放在这里而不是 cmets):

x = np.array([np.array([i]) for i in range(100000)])
%timeit np.concatenate(x).tolist()
%timeit np.hstack(x).tolist()
%timeit x.flatten().tolist()
%timeit x.ravel().tolist()

输出

10 loops, best of 3: 55.2 ms per loop
10 loops, best of 3: 155 ms per loop
100 loops, best of 3: 2.45 ms per loop
100 loops, best of 3: 2.29 ms per loop

【讨论】:

  • 我认为我们的时间差异与以下事实有关:您的列表 xnp.arraynp.arrays 开始的,而我使用的是 @ 列表987654340@s。我也会将我的基准添加到我的答案中。有趣的是,似乎大部分时间都花在将列表转换为数组上(np.array(my_list) 是真正增加了flattenravel 的时间)
【解决方案2】:

使用np.concatenate 避免手动迭代:

my_list = [np.array([ 3755.16235032]),
 np.array([ 3755.16235032]),
 np.array([ 3755.16235032]),
 np.array([ 3755.16235032])]

new_list = np.concatenate(my_list).tolist()

>>> new_list
[3755.16235032, 3755.16235032, 3755.16235032, 3755.16235032]

基准测试:

基于 cmets 中的广泛讨论,这是我的基准测试:

my_list = [np.random.randn(1) for _ in range(100000)]

def concat_method(my_list=my_list):
    return np.concatenate(my_list).tolist()

def hstack_method(my_list=my_list):
    return np.hstack(my_list).tolist()

def flatten_method(my_list=my_list):
    return np.array(my_list).flatten().tolist()

def ravel_method(my_list=my_list):
    return np.array(my_list).ravel().tolist()

import timeit

>>> timeit.timeit(concat_method, number=100) / 100
0.025655772869977226
>>> timeit.timeit(hstack_method, number=100) / 100
0.1172302443100125
>>> timeit.timeit(ravel_method, number=100) / 100
0.041237239889997
>>> timeit.timeit(flatten_method, number=100) / 100
0.0412076849100049

【讨论】:

  • OP 明确要求提供浮点数列表,而不是浮点数数组。我不知道为什么这就是他想要的,但是……
  • 不确定它是否比 N=4 的 listcomp 更好,但如果他要使用 numpy,至少 OP 学习如何做到这一点是值得的。跨度>
  • 我其实不知道。如果重要的话,我会%timeit。但如果这无关紧要,而且很可能无关紧要,concatenate 可能更容易理解。 (我在对这个问题的评论中将flatten 放在concatenate 之前的唯一原因是这是我碰巧首先想到的,而不是我认为它会更好……)
  • 你说得对,这可能无关紧要......但我的好奇心战胜了我(我知道你内心深处也渴望知道......)。在 100000 个数组的列表中,flatten 需要约 0.041 秒,而 concat 需要约 0.026 秒。这包括在两种情况下都使用tolist() 转换为列表。
  • 现在你必须从 Wen 的回答中尝试 hstack... 并且有人会过来建议普通的旧 stackreshape。看看你让自己陷入了什么。
【解决方案3】:

通过使用hstack

np.hstack(my_list).tolist()
Out[180]: [3755.16235032, 3755.16235032, 3755.16235032, 3755.16235032]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 2013-10-20
    • 2011-04-04
    • 1970-01-01
    • 2015-05-26
    • 2023-03-14
    • 2014-10-13
    相关资源
    最近更新 更多