У меня есть тренировочные данные с 2 измерениями. (200 результатов по 4 функциям)
Я проверил 100 различных приложений с 10 повторениями, в результате чего получилось 1000 файлов csv.
Я хочу сложить все результаты csv для машинного обучения. Но я не знаю как.
каждый из моих CSV-файлов выглядит следующим образом.
test1.csv для данных массива numpy
[[0 'crc32_pclmul' 445 0]
[0 'crc32_pclmul' 270 4096]
[0 'crc32_pclmul' 234 8192]
...
[249 'intel_pmt' 272 4096]
[249 'intel_pmt' 224 8192]
[249 'intel_pmt' 268 12288]]
Я пробовал ниже код Python.
path = os.getcwd()
csv_files = glob.glob(os.path.join(path, "*.csv"))
cnt=0
for f in csv_files:
cnt +=1
seperator = '_'
app = os.path.basename(f).split(seperator, 1)[0]
if cnt==1:
a = np.array(preprocess(f))
b = np.array(app)
else:
a = np.vstack((a, np.array(preprocess(f))))
b = np.append(b,app)
print(a)
print(b)
Функция предварительной обработки возвращает результаты df.to_numpy для каждого файла csv.
Мои ожидания были такими, как показано ниже. а(1000, 200, 4)
[[[0 'crc32_pclmul' 445 0]
[0 'crc32_pclmul' 270 4096]
[0 'crc32_pclmul' 234 8192]
...
[249 'intel_pmt' 272 4096]
[249 'intel_pmt' 224 8192]
[249 'intel_pmt' 268 12288]],
[[0 'crc32_pclmul' 445 0]
[0 'crc32_pclmul' 270 4096]
[0 'crc32_pclmul' 234 8192]
...
[249 'intel_pmt' 272 4096]
[249 'intel_pmt' 224 8192]
[249 'intel_pmt' 268 12288]],
...
[[0 'crc32_pclmul' 445 0]
[0 'crc32_pclmul' 270 4096]
[0 'crc32_pclmul' 234 8192]
...
[249 'intel_pmt' 272 4096]
[249 'intel_pmt' 224 8192]
[249 'intel_pmt' 268 12288]]]
Тем не менее, я получаю это. а(200000, 4)
[[0 'crc32_pclmul' 445 0]
[0 'crc32_pclmul' 270 4096]
[0 'crc32_pclmul' 234 8192]
...
[249 'intel_pmt' 272 4096]
[249 'intel_pmt' 224 8192]
[249 'intel_pmt' 268 12288]]
Я хочу получить доступ к каждому результату csv, используя от [0] до [1000], каждый подмассив выглядит как (200,4) Как я могу решить проблему? я совсем потерялся






Создайте новый список (вне цикла) и добавьте каждый элемент в этот новый список после прочтения.
Вы должны измениться с vstack на stack
la=[]
lb=[]
for f in csv_files:
cnt +=1
seperator = '_'
app = os.path.basename(f).split(seperator, 1)[0]
la.append(preprocess(f))
lb.append(app)
a=np.stack(la, axis=0)
b=np.array(lb)
vstack может складываться только по строкам, а функция stack может складываться по новой оси.
Я должен был дать полный код. Виноват! Я обновил код. Теперь это должно работать.
Ну да, это то, что делает vstack (и append). Он объединяет объекты на одной оси (оси строк).
a1=np.arange(10).reshape(2,5)
# [[0,1,2,3,4],
# [5,6,7,8,9]]
a2=np.arange(10,20).reshape(2,5)
# [[10, 11, 12, 13, 14],
# [15, 16, 17, 18, 19]])
np.vstack((a1,a2))
# [[ 0, 1, 2, 3, 4],
# [ 5, 6, 7, 8, 9],
# [10, 11, 12, 13, 14],
# [15, 16, 17, 18, 19]])
b1=np.arange(5)
b2=np.arange(5,10)
np.append(b1,b2)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Если вы ожидаете (из этих примеров) добавления по новой оси, вам нужно добавить ее или использовать более гибкий stack.
np.vstack(([a1],[a2]))
#array([[[ 0, 1, 2, 3, 4],
# [ 5, 6, 7, 8, 9]],
#
# [[10, 11, 12, 13, 14],
# [15, 16, 17, 18, 19]]])
Или, в случае 1d, используйте vstack вместо append
np.vstack((b1,b2))
#array([[0, 1, 2, 3, 4],
# [5, 6, 7, 8, 9]])
Но что еще более важно, вы не должны делать это в первую очередь внутри цикла. Каждая из этих функций (stack, vstack, append) воссоздает новый массив.
Вероятно, было бы более эффективно просто добавить все ваши np.array(preprocess(f)) и b = np.array(app) в чистый список Python и вызывать stack и vstack только после того, как вы их все прочитали.
Или, что еще лучше, просто добавьте непосредственно preprocess(f) и app внутри списка Python. И вызовите np.array только после цикла, и все.
Итак, что-то вроде
la=[]
lb=[]
for f in csv_files:
cnt +=1
seperator = '_'
app = os.path.basename(f).split(seperator, 1)[0]
la.append(preprocess(f))
lb.append(app)
a=np.array(la)
b=np.array(lb)
Спасибо!! вы действительно сэкономили мое время. Я совершенно новичок в python и во всем остальном. Хорошего дня :)
Я получаю сообщение об ошибке с вашим кодом. ValueError: все входные массивы должны иметь одинаковую форму