Объединить списки массивов в один список массивов - PullRequest
1 голос
/ 26 сентября 2019

Я потратил больше времени на эту проблему, чем я готов признать.У меня есть функция с именем:

def array_funct(filename):
...
 data = np.array((array))
 return data

, которая считывает в .txt файлы из папки и возвращает пустой массив.

Первая строка представляет собой список xкоординаты и вторая строка - соответствующие координаты y.Поэтому я использую:

array_funct(filename)[:,0]
array_funct(filename)[:,1]

для доступа к координатам x и y.

Теперь все, что я хочу сделать, - это создать цикл for, который будет читать более 1 файла и сохранять ихследующим образом

for i in range(0,number_of_files):

    array_funct(file[i])[:,0]
    array_funct(file[i])[:,1]

Давайте посмотрим на x-списки, которые я получаю:

print(array_funct(file[0])[:,0])  
[1,2,3,4]
print(array_funct(file[1])[:,0]) 
[2,4,6,8]

Все, что я хочу, это взять эти два однотипных списка и создать:

x_tot = [[1,2,3,4], [2,4,6,8]]

так, чтобы я мог получить доступ к элементам отдельных списков, например:

x_tot[0] = [1,2,3,4]

Это так сложно?Должен ли я прекратить использование массива NumPy?Я хотел бы остаться в NumPy, если возможно.

Также имейте в виду, что я сделал этот пример только для 2 файлов, но это может быть больше.Я просто хочу создать x_tot и y_tot для переменного количества файлов, которые я бы прочитал. Так, что:

x_tot = [[1,2,3],[2,3,4],[..],..]
x_tot = [[2,4,6],[4,6,8],[..],..]

Ответы [ 2 ]

2 голосов
/ 26 сентября 2019

С учетом следующей функции array_funct и списка filenames:

def array_funct(filename):
    # Fake random data, replace with data read from file
    data_read = [[1,2,3,4], [5,6,7,8]] # [random.sample(range(1, 10), 7), random.sample(range(1, 10), 7)]  
    data = np.array(data_read) 
    return data

filenames = ['file1.txt', 'file2.txt']

Попробуйте этот код:

lx = [list(array_funct(file)[0]) for file in filenames]
ly = [list(array_funct(file)[1]) for file in filenames]

Или более эффективно, прочитав и прокрутив файл один раз:

all_data = [(list(arr[0]),list(arr[1])) for arr in [array_funct(f) for f in filenames]]
lx, ly = list(map(list, zip(*all_data)))

В обоих случаях вывод выглядит следующим образом:

# lx = [[1, 2, 3, 4], [1, 2, 3, 4]]
# ly = [[5, 6, 7, 8], [5, 6, 7, 8]]
1 голос
/ 26 сентября 2019

Что-то вроде:

x_tot = np.array([array_funct(file[i])[:,0] for i in range(0,number_of_files)])

должно работать.

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