Как изменить массив Numpy в цикле for - PullRequest
0 голосов
/ 16 марта 2019

У меня есть Pandas Dataframe из 1 и 0, преобразованный в массив: [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1]

Я использую следующую функцию для изменения массива:

def regressor(x, param):
    new_array = x
    for i in range(len(new_array)):

        length = len(new_array)
        current = new_array[(length-i)-1]
        previous = new_array[(length-i)-2]

        if current != 0:
            if previous == 0:
                new_array[(length-i)-2] = current*param

    return new_array

Однако мой массив все еще не изменился. new_array [(length-i) -2], похоже, не вносит изменений в этот элемент массива.

Может кто-нибудь сказать мне, что мне не хватает? Спасибо

ОБНОВЛЕНИЕ: Моя проблема была решена путем преобразования DataFrame в pandas.Series и последующего преобразования его в список внутри функции.

1 Ответ

0 голосов
/ 16 марта 2019

Если я запускаю ваш код, я получаю это (для param = 2):

x = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]

def regressor(x, param):
    new_array = x
    for i in range(len(new_array)):

        length = len(new_array)
        current = new_array[(length-i)-1]
        previous = new_array[(length-i)-2]

        if current != 0:
            if previous == 0:
                new_array[(length-i)-2] = current * param

    return new_array

new_array = regressor(x, 2)
print(new_array)
# Output:
# [8, 4, 2, 1, 2097152, 1048576, 524288, 262144, 131072, 65536, 32768, 16384, 8192, 4096, 2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1]

Почему вы не видите изменений в вашем new_array? Вы действительно вызываете функцию регрессора для обновления вашего массива? Кроме того, копирование x в new_array в начале функции является избыточным.

Просто повторно опубликовать вашу функцию с некоторыми изменениями для лучшей читабельности:

def regressor(arr, param):
    for i in range(len(arr)):

        length = len(arr)
        current = arr[(length-i)-1]
        previous = arr[(length-i)-2]

        if (current != 0) and (previous == 0):
                arr[(length-i)-2] = current * param

    return arr
...