Найти - Пользователи
Полная версия: Сортировка выборка
Начало » Python для новичков » Сортировка выборка
1
KH93b
У меня есть файл с данными.
По типу:
25,37,45,54,67
33,67,43,78,50
12,32,72,96,45

Много строк и 5 столбцов.
Задача, взять 3-й элемент каждой строки 10 строк, записать в строку через запятую в новый файл. Отступить один шаг от первой строки, взять следующий 10 строк и записать во вторую строку…
Как я делаю, загружаю исходный файл numpy.loadtxt(1.txt)
И дальше танцы с бабнами…
Можете посоветовать, как это сделать профессионально и грамотно?
Striver
Как я понимаю, везде, где написано число 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()
Не знаю, насколько это “профессионально и грамотно”…
KH93b
Я тоже через список делал… мне казалось как-то много кода, честно сказать у меня еще больше кода)))
Но в любом случае огромное спасибо за ответ
Striver
мне казалось как-то много кода
Если точно известно, что количество строк делится на 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 не делится, то всё это упадёт с ошибкой.
KH93b
Striver
Если точно известно, что количество строк делится на 10
Такое вряд ли… но в чем проблема сделать arr2 = len(arr)//10 ?
Можно отсечь кусок с конца, это не страшно
Striver
но в чем проблема сделать arr2 = len(arr)//10 ?
Во-первых, да, нужно ставить именно //, иначе размерность нецелая будет. Тут мой косяк.
А во-вторых, arr.reshape(n,m) всегда падает с ошибкой, если n*m не равно длине массива, т.е. надо обрубить массив ещё до этой операции.
Можно отсечь кусок с конца, это не страшно
А вот это только тому, кто ставит задание, известно, что можно отсечь, а что нельзя. Исходя из того, что ты написал в первом сообщении, требуется использовать все числа. А так получается что-то вроде “мне тут часть данных мешается сделать красиво, выкину их…”. Вряд-ли это “профессионально и грамотно” :)
KH93b
Striver
arr3=arr2.reshape(len(arr2)/10,10)
А если данные float? Тут ошибка у меня вылезла. В примере, я int указал, сорри
TypeError: ‘float’ object cannot be interpreted as an integer
KH93b
Вот еще какой момент. В твоем коде мы берем 10 строк, затем следующие 10. А у меня получается - берем 10 строк
 [0:10]
следующие 10
 [1:11]
KH93b
Я вот не могу понять, как в цикле пройти 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 = []
Striver
А если данные float? Тут ошибка у меня вылезла. В примере, я int указал, сорри
TypeError: ‘float’ object cannot be interpreted as an integer
там при загрузке в параметре dtype указывается тип данных:
 arr = numpy.loadtxt("1.txt", delimiter=",", dtype=int)
нужен float - подставь его вместо int, или вообще ничего не указывай, там float по-умолчанию.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB