#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