строка Python, представляющая несколько массивов в массивы - PullRequest
2 голосов
/ 26 июня 2019

У меня есть строка, представляющая массив nD в следующем формате:

"[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]] [[6, 7, 8, 9, 10], [6, 7, 8, 9, 10], [6, 7, 8, 9, 10], [6, 7, 8, 9, 10]] [[11, 12, 13, 14, 15], [11, 12, 13, 14, 15], [11, 12, 13, 14, 15], [11, 12, 13, 14, 15]]"

Теперь я хочу преобразовать эту строку в массив NxPy 4x5x3 (int) (размер может быть динамическим в зависимости от количества значений в одинарных и двойных скобках), что-то вроде этого:

        /[11, 12, 13, 14, 15]
       / [11, 12, 13, 14, 15]
      /  [11, 12, 13, 14, 15]
     /   [11, 12, 13, 14, 15]    
    /[6, 7, 8, 9, 10]   
   / [6, 7, 8, 9, 10]  
  /  [6, 7, 8, 9, 10] 
 /   [6, 7, 8, 9, 10]                  
[1, 2, 3, 4, 5]   
[1, 2, 3, 4, 5]  
[1, 2, 3, 4, 5] 
[1, 2, 3, 4, 5]

Как это можно сделать эффективно, кроме зацикливания на каждом символе.

1 Ответ

3 голосов
/ 26 июня 2019

Вы можете просто eval изменить строку, преобразовав ее в набор списков списков. Затем преобразуйте это в массив NumPy. Одна проблема заключается в том, что в вашей строке отсутствуют запятые после каждого 2D-массива (т.е. после ]]). Чтобы это исправить, мы просто вставляем эти пропущенные запятые:

import numpy as np

s = "[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]] [[6, 7, 8, 9, 10], [6, 7, 8, 9, 10], [6, 7, 8, 9, 10], [6, 7, 8, 9, 10]] [[11, 12, 13, 14, 15], [11, 12, 13, 14, 15], [11, 12, 13, 14, 15], [11, 12, 13, 14, 15]]"
a = np.array(eval(s.replace(']]', ']],')))
print(a)

Примечание по eval

Использование eval часто считается несколько опасным, поскольку он может выполнять произвольный код. Более безопасная альтернатива - literal_eval из ast модуля:

import ast
a = np.array(ast.literal_eval(s.replace(']]', ']],')))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...