[英]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.