Преобразование списка списков в тип массива в Python

#python #numpy #numpy-ndarray #mlxtend

#python #numpy #numpy-ndarray #mlxtend

Вопрос:

У меня есть такая матрица, и я хочу преобразовать ее в массив для обработки. Как это сделать

 [[25  3  0  1  0  2  1]
 [ 1 21  0  0  0  0  0]
 [ 0  3 18  0  0  0  0]
 [ 1  0  0 35  2  0  0]
 [ 0  0  0  4 27  2  0]
 [ 0  0  0  0  1 27  0]
 [ 1  1  0  0  0  0 34]]
  

Я понимаю, что он должен иметь вид

 [[25,  3,  0,  1,  0,  2,  1],
 [ 1, 21,  0,  0,  0,  0,  0],
 [ 0,  3, 18,  0,  0,  0,  0],
 [ 1,  0,  0, 35,  2,  0,  0],
 [ 0,  0,  0,  4, 27,  2,  0],
 [ 0,  0,  0,  0,  1, 27,  0],
 [ 1,  1,  0,  0,  0,  0, 34]]
  

Обычно то, что я делаю, это преобразую мой массив в указанную выше форму вручную и вызываю

 class = np.array([[28,  3,  0,  0,  5,  2,  1],
 [ 6, 25 , 0,  2,  2,  8,  0],
 [ 0 , 1 ,51 , 0,  0,  0,  0],
 [ 5 , 2 , 0 ,25, 12,  2,  2],
 [ 1 , 0 , 0,  2, 40,  6,  0],
 [ 0 , 0 , 0  ,0,  1, 48,  0],
 [ 2 , 1,  0  ,0 , 1,  1, 51]])
  

Комментарии:

1. Хранится ли этот список в переменной в виде строки?

2. Откуда взята матрица и в каком она формате? Это недопустимый синтаксис, если вы копируете его в python.

3. @user567879 ты считываешь матрицу из файла?

4. Ваш средний блок с запятыми — это список списков, и окончательный np.array преобразует его правильно. Первый блок выглядит как str отображение массива, многострочной строки (но без кавычек).

5. @Marco Да, он хранится в переменной в виде строки

Ответ №1:

Я не уверен, какой формат у вас есть при импорте матрицы, вот решение для матрицы на основе строк.

 from ast import literal_eval

s = '''
[[25  3  0  1  0  2  1]
 [ 1 21  0  0  0  0  0]
 [ 0  3 18  0  0  0  0]
 [ 1  0  0 35  2  0  0]
 [ 0  0  0  4 27  2  0]
 [ 0  0  0  0  1 27  0]
 [ 1  1  0  0  0  0 34]]
'''
s = s.replace(" [","[").replace("[ ","[")
s = ", ".join(s.split())
ast.literal_eval(s)

# Out[12]: 
# [[25, 3, 0, 1, 0, 2, 1],
#  [1, 21, 0, 0, 0, 0, 0],
#  [0, 3, 18, 0, 0, 0, 0],
#  [1, 0, 0, 35, 2, 0, 0],
#  [0, 0, 0, 4, 27, 2, 0],
#  [0, 0, 0, 0, 1, 27, 0],
#  [1, 1, 0, 0, 0, 0, 34]]
  

или в одной строке:

 ast.literal_eval(", ".join(s.replace(" [","[").replace("[ ","[").split()))
  

Ответ №2:

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

 import re
import numpy as np

my_list = """
[[25  3  0  1  0  2  1]
 [ 1 21  0  0  0  0  0]
 [ 0  3 18  0  0  0  0]
 [ 1  0  0 35  2  0  0]
 [ 0  0  0  4 27  2  0]
 [ 0  0  0  0  1 27  0]
 [ 1  1  0  0  0  0 34]]
"""

rows = []

for line in filter(len, map(str.strip, my_list.split("n"))):
    rows.append([ int(v) for v in re.findall(r"b[0-9] b", line) ])

np_rows = np.array(rows)
  

В этом случае,

 >>> np_rows
array([[25,  3,  0,  1,  0,  2,  1],
       [ 1, 21,  0,  0,  0,  0,  0],
       [ 0,  3, 18,  0,  0,  0,  0],
       [ 1,  0,  0, 35,  2,  0,  0],
       [ 0,  0,  0,  4, 27,  2,  0],
       [ 0,  0,  0,  0,  1, 27,  0],
       [ 1,  1,  0,  0,  0,  0, 34]])