Создание списка из матрицы Scipy - PullRequest
5 голосов
/ 14 января 2011

Это мой первый пост, и я все еще новичок в Python и Scipy, так что будьте спокойны! Я пытаюсь преобразовать матрицу Nx1 в список Python. Скажем, у меня есть матрица 3х1

x = scipy.matrix([1,2,3]).transpose()

Моя цель - создать список y из x, чтобы

y = [1, 2, 3]

Я пытался использовать метод tolist(), но он возвращает [[1], [2], [3]], что не является результатом, которого я добиваюсь. Лучшее, что я могу сделать, это

y = [xi for xi in x.flat]

но это немного громоздко, и я не уверен, есть ли более простой способ достичь того же результата. Как я уже сказал, я все еще вступаю в борьбу с Python и Scipy ...

Спасибо

Ответы [ 3 ]

3 голосов
/ 14 января 2011

Вопрос к вашему вопросу

Пока Свен и Нави ответили на ваш вопрос о том, как конвертировать

x = scipy.matrix([1,2,3]).transpose()

в список, я задам вопрос, прежде чем ответить:

  • Почему вы используете матрицу Nx1 вместо массива?

Использование массива вместо матрицы

Если вы посмотрите на страницу вики / документации Numpy for Matlab Users, в разделе 3 обсуждается «массив» или «матрица»? Что я должен использовать? . Краткий ответ: вы должны использовать массив.

Одним из преимуществ использования массива является то, что:

Вы можете рассматривать массивы ранга 1 как векторы строк или столбцов. точка (A, v) обрабатывает v как вектор столбца, а точка (v, A) рассматривает v как вектор строки. Это избавит вас от необходимости набирать много транспонирований.

Кроме того, как указано в справочной документации Numpy , «матричные объекты всегда двумерны». Вот почему x.tolist() вернул вам вложенный список [[1], [2], [3]].

Поскольку вам нужен объект Nx1, я бы рекомендовал использовать массив следующим образом:

>>> import scipy
>>> x = scipy.array([1,2,3])
>>> x
array([1, 2, 3])
>>> y = x.tolist()     // That's it. A clean, succinct conversion to a list.
>>> y
[1, 2, 3]

Если вы действительно хотите использовать матрицу

Если по какой-то причине вам действительно нужно / хотите использовать матрицу вместо массива, вот что я бы сделал:

>>> import scipy
>>> x = scipy.matrix([1,2,3]).transpose()
>>> x
matrix([[1],
        [2],
        [3]])
>>> y = x.T.tolist()[0]
>>> y
[1, 2, 3]

Словом, x.T.tolist()[0] будет:

  1. Транспонировать матрицу x с помощью атрибута .T
  2. Преобразовать транспонированную матрицу во вложенный список, используя .tolist()
  3. Возьмите первый элемент из вложенного списка, используя [0]
0 голосов
/ 14 января 2011

Я думаю, вы почти там используете функцию выравнивания http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.flatten.html

0 голосов
/ 14 января 2011

Как насчет

x.ravel().tolist()[0]

или

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