Как объединить два 1D-списка в 2D-массив? - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь прочитать файлы mzXML, используя класс mzxml Pyteomics. Элементы, к которым мне нужно получить доступ, имеют формат numpy.ndarray, который я конвертирую в виде списков. Файлы mzXML содержат несколько столбцов со списками в качестве значений. Основная цель - объединить два списка в двумерный массив (рядом друг с другом по столбцам), чтобы я мог сохранить их в виде файлов CSV.

Я попытался использовать np.concatenate((mzplist, mzplist2), axis=1), что привело к ошибке axis=1 о том, что axis=1 выходит за пределы для одномерных массивов. Я также пытался использовать hstack, column_stack. Самое близкое, что я получил, было от column_stack (код ниже), но результирующий массив был 1D, когда я просматривал полученные CSV-файлы (каждая ячейка Excel содержит значение m / z и значение интенсивности, разделенные пробелом).

plist = []

for files in os.listdir(full_path):
    filename = os.path.basename(files)
    with mzxml.read(full_path + '\\' + filename) as reader:
        for line in reader:
            mzplist = line['m/z array'].tolist()
            mzplist2 = line['intensity array'].tolist()
            print(type(mzplist))
            mzplist = np.column_stack([mzplist, mzplist2])
            #mzplist.columns = ['mass', 'Intensity']
            np.savetxt(newfolder + '\\' + filename + '.csv', mzplist) 
            plist = []
            mzplist = []
            mzplist2 = []

Ожидаемые результаты для mzplist:

 Mass       Intensity
  1            2
  3            4
  5            6

Здесь line['m/z array'].tolist() - список [1, 3, 5, ...], а line['intensity array'].tolist() - список [2, 4, 6, ...].

Я что-то упустил?

Ответы [ 2 ]

0 голосов
/ 18 января 2019

С 2 списками, как вы описываете:

In [39]: alist=[1,3,5,7]; blist=[2,4,6,8]

Естественный способ объединить их в массив:

In [40]: arr = np.array((alist, blist))
In [41]: arr
Out[41]: 
array([[1, 3, 5, 7],
       [2, 4, 6, 8]])

Транспонирование этого массива выглядит следующим образом:

In [42]: arr.T
Out[42]: 
array([[1, 2],
       [3, 4],
       [5, 6],
       [7, 8]])

Который мы можем написать savetxt как:

In [44]: np.savetxt('foo.txt', arr.T, fmt='%5d')
In [45]: cat foo.txt
    1     2
    3     4
    5     6
    7     8

column_stack и c_ создадут один и тот же массив.

Вы можете добавить разделитель ',', если этого требует ваш внешний читатель.

Знаете ли вы, как читать вывод записи savetxt в виде простого текста? Я использую bash оболочку cat.

Когда у людей возникают проблемы с чтением и записью файлов csv, мы обычно просим образцы, чтобы мы могли воспроизвести проблему. При необходимости может помочь выборка промежуточных массивов (например, вывод column_stack). В противном случае нам остается только догадываться, в чем проблема.

0 голосов
/ 17 января 2019

каждая ячейка Excel содержит значение m / z и значение интенсивности, разделенные пробелом

Я подозреваю, что источником проблемы является эта строка

np.savetxt(newfolder + '\\' + filename + '.csv', mzplist)

, так как пробел является разделителем по умолчанию для np.savetxt ( как указано в документации ), попробуйте заменить эту строку на

np.savetxt(newfolder + '\\' + filename + '.csv', mzplist, delimiter=',')

и проверьте, поможет ли это.

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