как добавить массив в больший массив - PullRequest
0 голосов
/ 07 февраля 2020

РЕДАКТИРОВАТЬ: Извините, позвольте мне добавить некоторые разъяснения. У меня есть python код:


E1 = [1,2,3,4]
E2 = [2,3,4,5]
#E3 = [...] and so on

arraylist = []

for i in range(1,acq+1):
    dat = "E{}".format(i)
    arraylist.append(dat)

E_total  = np.add.reduce([arraylist])

Я хочу добавить ранее определенные массивы E1, E2, E3 ... в массив, чтобы print (arraylist) возвращал [E1, E2, E3, ....]

Прямо сейчас, когда я печатаю список массивов, он выглядит как ["E1", "E2", "E3"]. Когда я пытаюсь суммировать массивы для решения E_total, я получаю ошибку, потому что E1 не вызывает мой массив E1 = [1,2,3,4], а вызывает строку «E1», которая не имеет определения.

Я хочу иметь arraylist = [E1, E2, E3, ...] и не добавлять строки "E1" "E2" ...

Когда я печатаю (arraylist [0]), он возвращает E1, я хотел бы, чтобы он возвращал [1,2,3,4], поскольку это то, что E1 определено как.

Могу ли я сделать это без словаря? Я не хочу определять "E1": E1, "E2": E2 и так далее. Это кажется очень громоздким и неосуществимым для многих E.

обновление Набор текста вручную:

arraylist = [E1,E2,E3,...] 
sums = np.add.reduce([arraylist]) 

Работает! Я думаю, что проблема заключается в том, что я добавляю строку «E1» к массиву с помощью forl oop, а не E1. Как я могу использовать .append так, чтобы я мог добавить E1 вместо строки "E1"

Вот как я получаю массивы E_n:

A1 = glob.glob('/media...) 
A1.sort() 
B1 =[] 
for elem in A1: 
  B1.append(float((elem.split('_'))[3]))
C1 = [] 
for elem in A1: 
C1.append(np.sum(np.genfromtxt(elem)))
E1 = np.gradient(C1)

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

Вы пытаетесь создать многомерный массив NumPy. Мне все еще не ясно, почему вы хотите это сделать, или как именно выглядит ваш вклад, но я подумал, что лучше всего поделиться реальным решением.

import numpy as np

E1 = [1, 2, 3, 4]
E2 = [2, 3, 4, 5]
E3 = [5, 6, 7, 8]

two_dim_list = [E1, E2, E3]

print(two_dim_list)

arr = np.array(two_dim_list)

print(arr)

Вывод:

[[1, 2, 3, 4], [2, 3, 4, 5], [5, 6, 7, 8]]
[[1 2 3 4]
 [2 3 4 5]
 [5 6 7 8]]
0 голосов
/ 07 февраля 2020

Этот код создаст нужный вам массив массивов, но я бы серьезно пересмотрел представление о том, как организованы ваши входные данные (используйте dict с ключами порядкового номера, которые сопоставляются с вашими массивами или что-то подобное).

E1 = [1, 2, 3, 4]
E2 = [2, 3, 4, 5]
E3 = [5, 6, 7, 8]

arraylist = []
acq = 3
temp = []
for i in range(acq):
    exec_str = "temp = E{}".format(i+1)
    exec(exec_str)
    arraylist.append(temp)

print(arraylist)

Это печатает: [[1, 2, 3, 4], [2, 3, 4, 5], [5, 6, 7, 8]]

Редактировать: учитывая вашу обновленную информацию, я бы структурировать мой ввод l oop примерно так. Этот код не будет полностью корректным (я не знаю, как выглядят ваши входные данные или имена файлов), но он должен дать вам представление о том, как вы должны l oop над этими данными (вы избежите всей проблемы с странные динамически именованные массивы, а также не нужно создавать все эти странные промежуточные списки и тому подобное.

input_files = glob.glob('/media*') #or whatever the search is

number_of_cols = 4 # set this to whatever value it will be in the real data, should equal the length of your eventual gradient

E = np.empty([len(input_files), number_of_cols])

for input_file in input_files.sort():
    split_name = input_file.split('_')
    # Save this in an array B here if you want to
    index_val = split_name[3]-1 # Your file numbers seem to start at 1, while arrays are 0 indexed.
    # Save this into an array C if you want to
    summed_val = np.sum(np.genfromtxt(input_file))

    input_grad = np.gradient(summed_val)
    E[index_val] = input_grad

Обратите внимание, что я могу неправильно обрабатывать индексирование (я не уверен, как выглядят ваши имена файлов) , Попробуйте использовать

for i, input_file in enumerate(input_files):
   ....
   E[i] = input_grad

, если порядок строк в E для вас не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...