Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 27, 2019 12:54:45

KH93b
Зарегистрирован: 2019-09-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка выборка

У меня есть файл с данными.
По типу:
25,37,45,54,67
33,67,43,78,50
12,32,72,96,45

Много строк и 5 столбцов.
Задача, взять 3-й элемент каждой строки 10 строк, записать в строку через запятую в новый файл. Отступить один шаг от первой строки, взять следующий 10 строк и записать во вторую строку…
Как я делаю, загружаю исходный файл numpy.loadtxt(1.txt)
И дальше танцы с бабнами…
Можете посоветовать, как это сделать профессионально и грамотно?

Офлайн

#2 Сен. 27, 2019 13:37:40

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

Сортировка выборка

Как я понимаю, везде, где написано число 10, надо читать “десяток”…

 len_line = 10
arr = numpy.loadtxt("1.txt", delimiter=",", dtype=int)
new_file = open("2.txt", "w")
new_list = []
for ind in range(arr.shape[0]):
    new_list.append(str(arr[ind,2]))
    if (ind+1) % len_line == 0:
        new_file.write(','.join(new_list)+'\n')
        new_list = []
if new_list:
    new_file.write(','.join(new_list))
new_file.close()
Не знаю, насколько это “профессионально и грамотно”…



Отредактировано Striver (Сен. 27, 2019 13:45:32)

Офлайн

#3 Сен. 27, 2019 13:53:25

KH93b
Зарегистрирован: 2019-09-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка выборка

Я тоже через список делал… мне казалось как-то много кода, честно сказать у меня еще больше кода)))
Но в любом случае огромное спасибо за ответ

Офлайн

#4 Сен. 27, 2019 14:13:56

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

Сортировка выборка

мне казалось как-то много кода
Если точно известно, что количество строк делится на 10, т.е. последняя строка результата будет длины 10, как и остальные, то можно наворотить так:
 arr = numpy.loadtxt("1.txt", delimiter=",", dtype=int)
arr2=arr[:,2]
arr3=arr2.reshape(len(arr2)/10,10)
numpy.savetxt("2.txt", arr3, delimiter=",")
Но если количество строк на 10 не делится, то всё это упадёт с ошибкой.



Офлайн

#5 Сен. 27, 2019 14:33:03

KH93b
Зарегистрирован: 2019-09-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка выборка

Striver
Если точно известно, что количество строк делится на 10
Такое вряд ли… но в чем проблема сделать arr2 = len(arr)//10 ?
Можно отсечь кусок с конца, это не страшно

Отредактировано KH93b (Сен. 27, 2019 14:33:53)

Офлайн

#6 Сен. 27, 2019 14:49:54

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

Сортировка выборка

но в чем проблема сделать arr2 = len(arr)//10 ?
Во-первых, да, нужно ставить именно //, иначе размерность нецелая будет. Тут мой косяк.
А во-вторых, arr.reshape(n,m) всегда падает с ошибкой, если n*m не равно длине массива, т.е. надо обрубить массив ещё до этой операции.
Можно отсечь кусок с конца, это не страшно
А вот это только тому, кто ставит задание, известно, что можно отсечь, а что нельзя. Исходя из того, что ты написал в первом сообщении, требуется использовать все числа. А так получается что-то вроде “мне тут часть данных мешается сделать красиво, выкину их…”. Вряд-ли это “профессионально и грамотно” :)



Офлайн

#7 Сен. 27, 2019 21:07:54

KH93b
Зарегистрирован: 2019-09-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка выборка

Striver
arr3=arr2.reshape(len(arr2)/10,10)
А если данные float? Тут ошибка у меня вылезла. В примере, я int указал, сорри
TypeError: ‘float’ object cannot be interpreted as an integer

Отредактировано KH93b (Сен. 27, 2019 21:12:58)

Офлайн

#8 Сен. 27, 2019 21:32:18

KH93b
Зарегистрирован: 2019-09-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка выборка

Вот еще какой момент. В твоем коде мы берем 10 строк, затем следующие 10. А у меня получается - берем 10 строк

 [0:10]
следующие 10
 [1:11]

Отредактировано KH93b (Сен. 27, 2019 21:43:33)

Офлайн

#9 Сен. 27, 2019 21:49:25

KH93b
Зарегистрирован: 2019-09-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка выборка

Я вот не могу понять, как в цикле пройти 10 шагов, а потом вернуться на шаг +1 от предыдущего начального

Вот так сделал, вроде то что надо. Конечно код с решейпом выглядит заманчиво, но там я навряд ли так сделаю

 for ind in range(arr.shape[0]-wn):
    new_list.append(str(arr[ind:wn+ind,7]))
    new_file.write(';'.join(new_list)+'\n')
    new_list = []

Отредактировано KH93b (Сен. 27, 2019 22:02:35)

Офлайн

#10 Сен. 30, 2019 08:09:48

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

Сортировка выборка

А если данные float? Тут ошибка у меня вылезла. В примере, я int указал, сорри
TypeError: ‘float’ object cannot be interpreted as an integer
там при загрузке в параметре dtype указывается тип данных:
 arr = numpy.loadtxt("1.txt", delimiter=",", dtype=int)
нужен float - подставь его вместо int, или вообще ничего не указывай, там float по-умолчанию.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version