簡體   English   中英

如何將列表轉換為numpy數組以過濾元素?

[英]How can I convert a list to a numpy array for filtering elements?

我有一個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

您不需要enumerate()

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

您過於復雜了:

import  numpy as np

grade_list_as_array = np.array(grade_list)

您不需要numpy數組來過濾列表。

清單理解

列表推導是編寫可讀和簡短代碼的強大工具:

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數組。

脾氣暴躁的

如果您確實要使用numpy.where ,則應跳過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)))

enumerate是多余的。 如果您確實有一個浮動列表,則可以使用:

import numpy as np 
arr = np.array(grade_list)
g_indices = np.where(arr > 0)[0]

由於在數字的布爾比較中, 0.0計算結果為False ,從技術上講,您也可以忽略>0

但是,如果您有嵌套列表或元組列表,則不會。 我們可能需要更多地了解您的清單。

首先嘗試將枚舉轉換為列表

我做了:

np.asarray(list(enumerate([1, 2, 3])))

您想使用np.array而不是np.asarray ,並且不需要enumerate

import numpy as np

grade_list=[0,1,2,3,2,1,2,3,1,0,2,4]
arr=np.array(grade_list)

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

print g_indices

>>> [ 1  2  3  4  5  6  7  8 10 11]

暫無
暫無

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

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