如何将列表转换为用于筛选元素的numpy数组?

2024-04-25 13:32:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个float数字的列表,我想把它转换成numpy array,这样我就可以使用numpy.where()来获取大于0.0(不是零)的元素的索引

我试过了,但运气不好:

import numpy as np

arr = np.asarray(enumerate(grade_list))
g_indices = np.where(arr[1] > 0)[0]

编辑:

需要dtype=float吗?你知道吗


Tags: importnumpy元素列表asnp数字float
3条回答

您不需要enumerate()

arr = np.asarray(grade_list)
g_indices = np.where(arr > 0)[0]

过滤列表不需要numpy数组。你知道吗

列表理解

List comprehensions是一个非常强大的工具,可以编写可读且简短的代码:

grade_list = [1, 2, 3, 4, 4, 5, 4, 3, 1, 6, 0, -1, 6, 3]
indices = [index for index, grade in enumerate(grade_list) if grade > 0.0]
print(indices)

给出[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 13]。这是一个标准的Python列表。如有必要,此列表可以在以后转换为numpy数组。你知道吗

努比

如果您真的想使用^{},您应该跳过enumerate

import numpy
grade_list = [1, 2, 3, 4, 4, 5, 4, 3, 1, 6, 0, -1, 6, 3]
grade_list_np = numpy.array(grade_list)
indices = numpy.where(grade_list_np > 0.0)[0]
print(indices)

给出[ 0 1 2 3 4 5 6 7 8 9 12 13]。你知道吗

性能比较

如果你只需要一个小的列表(例如<;100),列表理解是最快的方法。使用numpys where比先使用列表理解然后将其转换为numpy数组(列表长度为1000)快得多:

numpy.where (|L| = 1000): 13.5045940876
list_comprehension_np (|L| = 1000): 27.2982738018
list_comprehension (|L| = 1000): 15.2280910015

这些结果是使用以下脚本创建的:

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import random
import timeit
import numpy


def filtered_list_comprehension(grade_list):
    return [index for index, grade in enumerate(grade_list) if grade > 0.3]


def filtered_list_comprehension_np(grade_list):
    return numpy.array([index for index, grade in enumerate(grade_list)
                        if grade > 0.3])


def filtered_numpy(grade_list):
    grade_list_np = numpy.array(grade_list)
    return numpy.where(grade_list_np > 0.3)[0]

list_elements = 10000
grade_list = [random.random() for i in range(list_elements)]

res = timeit.timeit('filtered_numpy(grade_list)',
                    number=100000,
                    setup="from __main__ import grade_list, filtered_numpy")
print("numpy.where (|L| = %i): %s" % (list_elements, str(res)))
res = timeit.timeit('filtered_list_comprehension_np(grade_list)',
                    number=100000,
                    setup="from __main__ import grade_list, filtered_list_comprehension_np")
print("list_comprehension_np (|L| = %i): %s" % (list_elements, str(res)))
res = timeit.timeit('filtered_list_comprehension(grade_list)',
                    number=100000,
                    setup="from __main__ import grade_list, filtered_list_comprehension")
print("list_comprehension (|L| = %i): %s" % (list_elements, str(res)))

你太复杂了:

import  numpy as np

grade_list_as_array = np.array(grade_list)

相关问题 更多 >