Применить функцию к списку списков - Python - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь передать список списков функции итеративно, но возвращаю ошибку. Код ниже создает случайный список списков. После генерации он передается отдельной функции.

Итак, список списков называется mult_samples. Я надеюсь передать это функции.

Но я не могу передать весь список списков. Как я могу перебрать все подсписки и вернуть вывод в виде массива или df?

import pandas as pd
import random
import numpy as np

df = pd.DataFrame({                    
        'X' : [1.0,3.0,2.0,2.0,4.0,3.0,3.0,4.0,4.0],
    })

def randomSamples():

    A = df['X']

    n = len(df['X'])

    maxv = int(A.max())
    minv = int(A.min())

    one_sample = []

    for x in range(0, n):

        one_sample.append(random.randint(minv, maxv))

    samples = [one_sample for _ in range(10)]

    return samples

mult_samples = randomSamples()

Subset out list1 и list2

Out:

mult_samples[0] = [3, 2, 3, 3, 4, 2, 3, 3, 3]

mult_samples[1] = [1, 4, 1, 3, 3, 4, 3, 4, 2]

def func(U, m = 2, r = 0.2):

    def _maxdist(x_i, x_j):
        return max([abs(ua - va) for ua, va in zip(x_i, x_j)])

    def _phi(m):
        x = [[U[j] for j in range(i, i + m - 1 + 1)] for i in range(N - m + 1)]
        C = [len([1 for x_j in x if _maxdist(x_i, x_j) <= r]) / (N - m + 1.0) for x_i in x]
        return (N - m + 1.0)**(-1) * sum(np.log(C))

    N = len(U)

    return abs(_phi(m + 1) - _phi(m))

output_mult_samples = func(mult_samples)

#output_mult_samples = list(map(funclist, mult_samples))

print(output_mult_samples)

Out

mult_samples[0] = 0.253692959177
mult_samples[1] = 0.0397554025155

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

У вас есть много вариантов того, как вы хотите обрабатывать данные. Пример того, как l oop через вложенные списки, приведен ниже.

for i in range(len(mult_samples)):
    print('Here we are in a list: ' + str(mult_samples[i]))
    for j in range(len(mult_samples[i])):
        print('Access location ' + str(j) + 'in list ' + str(i) + ': ' + str(mult_samples[i][j]))

Чтобы сделать список в массиве np.array(some list).

Чтобы превратить словарь python во фрейм данных pd.DataFrame(some dict).

1 голос
/ 07 февраля 2020

Из того, что я вывел из вашего вопроса, предполагая, что вы хотите применить func к каждому списку в вашем списке, вы можете действовать следующим образом:

# apply the function 'func' to every LIST inside the main list
output_mult_samples = list(map(func, mult_samples))

РЕДАКТИРОВАТЬ: После получения определения func в вопрос, вам нужно только сопоставить это со списком списков.

Также вам нужно исправить функцию randomSamples. Все, что вы делаете на данный момент - это добавление одного и того же списка one_sample 10 раз в ваш samples. Вместо этого вы должны сделать что-то вроде этого:

samples = []

for _ in range(10):
    one_sample = []
    for x in range(0, n):
        one_sample.append(random.randint(minv, maxv))
    samples.append(one_sample)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...