Как перенести данные и обрезать данные из одного многомерного массива в другой с условием

#python

#python

Вопрос:

Я создал программу на Python, обрабатывающую вероятность различных наборов данных. Я ввожу «вручную» различные средние значения и стандартные отклонения, и это работает, однако мне нужно автоматизировать это, чтобы я мог загружать все свои данные через текстовый или CSV-файл. У меня пока что есть, но теперь есть вложенный запрос цикла for, я думаю, с проблемами индексов, но далее следует некоторая предыстория…

Мой код работает для небольшого набора данных, где я могу вручную ввести 6-8 рабочих параметров, но теперь мне нужно автоматизировать это и загружать различные входные данные неизвестных размеров с помощью csv / текстового файла. Я копирую свой существующий код и при необходимости изменяю его, но столкнулся с проблемой.

У меня есть 2_D numpy-массив, где некоторые вероятности были отсортированы в обратном порядке. У меня есть второй массив, который дает мне значение 68,3% каждой строки, и я хочу обрезать данные с низким значением 31,7%.

Мне нужно решение, которое может обрабатывать неопределенное количество строк.

Мой ранее существовавший код, работавший для одного одномерного массива, был

     prob_combine_sum= np.sum(prob_combine)

    #Reverse sort the probabilities
    prob_combine_sorted=sorted(prob_combine, reverse=True)

    #Calculate 1 SD from peak Prob by multiplying Total Prob by 68.3%
    sixty_eight_percent=prob_combine_sum*0.68269

    #Loop over the sorted list and append the 1SD data into a list 
    #onesd_prob_combine
    onesd_prob_combine=[]
    for i in prob_combine_sorted:
    onesd_prob_combine.append(i)
    if sum(onesd_prob_combine) > sixty_eight_percent:
    break
  

Это сработало. Однако теперь у меня есть многомерный массив, и я хочу взять данные о 1 стандартном отклонении из этого многомерного массива и вставить их в другой.

Вероятно, существует более одного способа сделать это, но я думал, что буду придерживаться цикла for, но теперь это сложнее из-за индексов. Мне нужно сохранить структуру данных, и мне нужно иметь возможность обрабатывать неограниченное количество строк в будущем.

Я смоделировал некоторые данные, и если я смогу заставить это работать с этим, я смогу поместить это в свою программу.

     sorted_probabilities=np.asarray([[9,8,7,6,5,4,3,2,1], 
    [87,67,54,43,32,22,16,14,2],[100,99,78,65,45,43,39,22,3], 
    [67,64,49,45,42,40,28,23,17]])
    sd_test=np.asarray([30.7215,230.0699,306.5323,256.0125])
    target_array=np.zeros(4).reshape(4,1)

    #Task transfer data from sorted_probabilities to target array on 
    condition that value in each target row is less than the value in the 
    sd_test array.

    #Ignore the problem that data transferred won't add up to 68.3%.
    My real data-sample is very big.  I just need a way of trimmining 
    and transferring.


    for row in sorted_probabilities:
        for element in row:
        target_array[row].append[i]
        if sum(target[row]) > sd_test[row]:
            break
  

Ошибка: Ошибка IndexError: индекс 9 выходит за пределы оси 0 с размером 4

Я знаю, что это не очень хорошая попытка. Моя проблема в том, что мне нужно решение, которое будет работать для любого 2D-массива, а не только для одного с 4 строками.

Я был бы действительно благодарен за любую помощь.

Спасибо

Редактировать:

Кто-нибудь может мне помочь с этим? Я борюсь.

Я думаю, причина, по которой мой цикл не будет работать, заключается в том, что строка ‘index’, которую я использую, является не числом, а в данном случае строкой. Я подумаю об этом. Тем временем, есть у кого-нибудь решение?

Спасибо

Я попробовал следующий код после прочтения комментариев:

     for counter, value in enumerate(sorted_probabilities):

        for i, element in enumerate(value):

        target_array[counter]=sorted_probabilities[counter][element]

        if target_array[counter] > sd_test[counter]:
               break
  

Я получаю ошибку: IndexError: индекс 9 выходит за пределы оси 0 с размером 9

Я думаю, это потому, что я пытаюсь добавить в массив numpy заранее определенные размеры? Я не уверен. Я собираюсь попробовать другой подход сейчас, поскольку я не могу этого сделать с этим подходом. Это затрудняет необходимость поддерживать строки в целевом массиве. Каждая строка относится к объекту, и если я потеряю структуру, это будет бессмысленно.

Ответ №1:

Я рекомендую вам использовать pandas. Вы можете напрямую читать csv в dataframe и выполнять множество операций над столбцами и тому подобное, чисто и опрятно.

Комментарии:

1. Я хочу перенести данные из одного массива в другой, обработав их так, чтобы я принимал верхние значения. Помогут ли Pandas с этим? Я мог бы использовать их позже, но сейчас я ищу решение.

2. Я попробовал следующий код: для счетчика, значение в enumerate (сортируемые вероятности): для i, элемент в numerate (значение):rarget_array[счетчик]=сортируемые вероятности[счетчик][элемент], если target_array[счетчик] > sd_test[счетчик]: break

3. столбец фрейма данных pandas — это массив; вы можете создать другой столбец и поместить в него значения с условием: например, df[‘newColumn’] = df[ df[‘oldColumn’] >= 0 ]. Проверьте документацию pandas, она предлагает еще много других возможностей

Ответ №2:

Вы смешиваете массивы numpy со списками python. Лучше использовать только один из них (предпочтительнее numpy). Также попробуйте отладить свой код, поскольку в нем есть либо синтаксические, либо логические ошибки. У вас нет переменной i , хотя вы используете ее как индекс; также вы используете row как индекс, хотя это числовой массив, но не целое число.

Я настоятельно рекомендую вам

0) отладьте свой код (по крайней мере, с печатями)

1) используйте enumerate для создания обоих ваших for циклов;

2) замените append простым присваиванием, потому что вы уже создали пустой вектор ( target_array ). Или инициализируйте свой target_array как пустой список и добавьте в него.

3) если вы хотите использовать свое решение для любого 2d-массива, оберните свой код в функцию

Комментарии:

1. Я обнаружил проблему с использованием строки в качестве индекса, но не смог решить ее с помощью циклов. Что бы я ни делал, кажется, выдает ошибку! Я подумаю о функции. Спасибо за рецензирование.

2. Я попробовал enumerate, но все еще не смог этого сделать. Смотрите мою правку в основном сообщении выше. Собираюсь попробовать другой угол.

Ответ №3:

Попробуйте это:

 sorted_probabilities=np.asarray([[9,8,7,6,5,4,3,2,1], 
                                 [87,67,54,43,32,22,16,14,2],
                                 [100,99,78,65,45,43,39,22,3],            
                                 [67,64,49,45,42,40,28,23,17]]
                                )
sd_test=np.asarray([30.7215,230.0699,306.5323,256.0125])
target_array=np.zeros(4).reshape(4,1)

for counter, value in enumerate(sorted_probabilities):
    for i, element in enumerate(value):
        target_array[counter] = element  # Here I removed the code that produced error
        if target_array[counter] > sd_test[counter]:
           break