Как я могу преобразовать ndarray в матрицу в scipy?

1

Как преобразовать ndarray в матрицу в numpy? Я пытаюсь импортировать данные из csv и превращать его в матрицу.

from numpy import array, matrix, recfromcsv
my_vars = ['docid','coderid','answer1','answer2']
toy_data = matrix( array( recfromcsv('toy_data.csv', names=True)[my_vars] ) )
print toy_data
print toy_data.shape

Но я получаю это:

[[(1, 1, 3, 3) (1, 2, 4, 1) (1, 3, 7, 2) (2, 1, 3, 3) (2, 2, 4, 4)
  (2, 4, 3, 1) (3, 1, 3, 3) (3, 2, 4, 3) (3, 3, 3, 4) (4, 4, 5, 1)
  (4, 5, 6, 2) (4, 2, 4, 3) (5, 2, 5, 4) (5, 3, 3, 1) (5, 4, 7, 2)
  (6, 1, 3, 3) (6, 5, 4, 1) (6, 2, 5, 2)]]
(1, 18)

Что мне нужно сделать, чтобы получить от 4 до 18 матриц из этого кода? На этот вопрос должен быть легкий ответ, но я просто не могу его найти.

  • 0
    Почему бы вам не изменить его, а не использовать матрицу?
  • 0
    Reshape не позволит мне преобразовать объект 1x18 в объект 4x18, не так ли?
Показать ещё 3 комментария
Теги:
arrays
numpy
matrix

2 ответа

5
Лучший ответ

Если конечной целью является создание матрицы, нет необходимости создавать повторную запись с именованными столбцами. Вы можете использовать np.loadtxt для загрузки csv в ndarray, а затем использовать np.asmatrix для преобразования его в матрицу:

import numpy as np
toy_data = np.asmatrix(np.loadtxt('toy_data.csv',delimiter=','skiprows=1))
print toy_data
print toy_data.shape

дает

[[ 1.  1.  3.  3.]
 [ 1.  2.  4.  1.]
 [ 1.  3.  7.  2.]
 [ 2.  1.  3.  3.]
 [ 2.  2.  4.  4.]
 [ 2.  4.  3.  1.]
 [ 3.  1.  3.  3.]
 [ 3.  2.  4.  3.]
 [ 3.  3.  3.  4.]
 [ 4.  4.  5.  1.]
 [ 4.  5.  6.  2.]
 [ 4.  2.  4.  3.]
 [ 5.  2.  5.  4.]
 [ 5.  3.  3.  1.]
 [ 5.  4.  7.  2.]
 [ 6.  1.  3.  3.]
 [ 6.  5.  4.  1.]
 [ 6.  2.  5.  2.]]
(18, 4)

Примечание: аргумент skiprows используется для пропуска заголовка в csv.

  • 0
    Отлично. Спасибо!
0

Вы можете просто прочитать все свои значения в векторе, а затем изменить его.

fo = open("toy_data.csv")

def _ReadCSV(fileobj):
  for line in fileobj:
    for el in line.split(","):
      yield float(el)


header = map(str.strip, fo.readline().split(","))
a = numpy.fromiter(_ReadCSV(fo), numpy.float64)
a.shape = (-1, len(header))

Но может быть еще более прямой путь с более новым numpy.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню