Сделать трехмерный массив numpy, используя цикл for в python

У меня есть тренировочные данные с 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) Как я могу решить проблему? я совсем потерялся

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
69
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Создайте новый список (вне цикла) и добавьте каждый элемент в этот новый список после прочтения.

Вы должны измениться с 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 может складываться по новой оси.

Я получаю сообщение об ошибке с вашим кодом. ValueError: все входные массивы должны иметь одинаковую форму

mangosrk 06.02.2023 07:25

Я должен был дать полный код. Виноват! Я обновил код. Теперь это должно работать.

MSS 06.02.2023 08:03
Ответ принят как подходящий

Ну да, это то, что делает vstackappend). Он объединяет объекты на одной оси (оси строк).

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 и во всем остальном. Хорошего дня :)

mangosrk 06.02.2023 07:38

Другие вопросы по теме