Преобразование вложенных списков в массивы в python

Я хотел бы знать, возможно ли иметь «вложенные массивы», то есть массив, содержащий массивы разной формы.

У меня есть список списков координат, так что-то вроде:

coord = [ [ [x1,y1],[x2,y2] ], [ [x3,y3],[x4,y4],[x5,y5] ], [ [x6,y6] ] ]

Я хотел бы преобразовать все эти списки в массивы, чтобы я мог выполнять с ними математические операции. Результатом будет (3,)-массив, содержащий 3 массива (по одному в каждой позиции) соответствующих фигур (2,2) (соответствующих вложенному списку [ [x1,y1],[x2,y2] ]), (3,2) и (1,2).

Конечная цель — сделать что-то вроде result = coord + [x7,y7], чтобы извлечь выгоду из свойств матричных операций в Python (мне сказали, что это намного эффективнее, чем выполнение циклов, и у меня много координат).

Результат будет:

result = [ [ [x1+x7,y1+y7],[x2+x7,y2+y7] ], [ [x3+x7,y3+y7],[x4+x7,y4+y7],[x5+x7,y5+y7] ] ]


person JoVe    schedule 29.04.2016    source источник
comment
Если вы хотите преобразовать все эти списки в массивы, как будет выглядеть результат?   -  person Quinn    schedule 29.04.2016
comment
Предлагаем вам прочитать Как задать хороший вопрос?   -  person martineau    schedule 29.04.2016
comment
Можете ли вы объяснить, почему мой вопрос плохой? Я новичок в Python, поэтому, на мой взгляд, это кажется ясным, но, возможно, это не имеет смысла. @ccf результатом будет (3,)-массив, содержащий 3 массива соответствующих форм (2,2), (3,2) и (1,2)   -  person JoVe    schedule 29.04.2016
comment
Если вам нужны МАТРИЦЫ в питоне, не задавайте вопрос о массиве. Это введет всех в заблуждение.   -  person mootmoot    schedule 29.04.2016
comment
Хорошо, я думал, что матрицы в питоне — это массивы. Кроме того, мне не нужны матрицы в математическом смысле. Я хочу использовать свойства массива python, такие как добавление вектора (3,) в массив (3,3) (добавит вектор в строки массива почленно).   -  person JoVe    schedule 02.05.2016


Ответы (4)


Если у вас есть координаты, то вы, вероятно, захотите использовать свой собственный класс для их хранения. Следующее не будет работать должным образом, предполагая, что координата [x1, x2], тогда

 result = coord + [x7,y7]

даст:

 result = [x1, x2, x7, y7]

Что вам следует подумать о том, чтобы написать свой собственный класс координат, например, и переопределить операторы (т.е. __add__), например:

class Coordinate(object):
    def __init__(self, x, y):
        self.x, self.y = x, y

    def __add__(self, other):
        return Coordinate(self.x + other.x, self.y + other.y)

    # ...

Также см. Руководство по магическим методам питонов

person tobspr    schedule 29.04.2016
comment
Проблема в том, что мне нужно хранить координаты во вложенных списках (вышележащая проблема сложнее, но объяснять ее бесполезно). Я отредактировал вопрос, надеюсь, стало понятнее - person JoVe; 29.04.2016

Вы можете использовать map для преобразования:

coord = map (lambda c: [ [xy[0] + x7, xy[1] + y7] for xy in c], coord )

Пример кода:

# some example coordinates
x1,y1 = 1,1
x2,y2 = 2,2
x3,y3 = 3,3
x4,y4 = 4,4
x5,y5 = 5,5
x6,y6 = 6,6
x7,y7 = 7,7
coord = [  [ [x1,y1],[x2,y2] ], [ [x3,y3],[x4,y4],[x5,y5] ], [ [x6,y6] ]  ]
# the result is:
coord = map (lambda c: [ [xy[0] + x7, xy[1] + y7] for xy in c], coord )
print (coord)

[Output]

[[[8, 8], [9, 9]], [[10, 10], [11, 11], [12, 12]], [[13, 13]]]
person Quinn    schedule 29.04.2016

Сначала преобразуйте список списков в список матриц numpy (matrix_ls):

coord = [  [ [ 1, 1],[ 2, 2] ], [ [ 3, 3],[ 4, 4],[ 5, 5] ], [ [ 6, 6] ]  ]

import numpy as np
matrix_ls = list(map(lambda m_ls: np.matrix(m_ls), coord))

Затем вы можете применять все виды матричных операций из Руководство по NumPy Вот пример с суммированием:

sum_matrix = np.matrix([10,10]) # [x7,y7]
result = [matrix + sum_matrix for matrix in matrix_ls]
person R3n3    schedule 22.08.2019

Вы пытаетесь

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

но ваша главная цель состоит в том, чтобы

преобразовать все эти списки в массивы, чтобы я мог выполнять с ними математические операции.

Понимание списка намного быстрее, чем закодированный цикл, хотя в основном это также цикл for, см. Почему понимание списка намного быстрее, чем добавление в список?. Вы можете комбинировать понимание списка с преобразованием списка в массивы numpy (матрицы — это просто многомерные массивы, а мы используем только одномерные массивы для вычислений), и это может даже хорошо работать с большим набором данных.

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

coord = [  [ [ 1, 1],[ 2, 2] ], [ [ 3, 3],[ 4, 4],[ 5, 5] ], [ [ 6, 6] ]  ]
x7 = 1
x8 = 1
[[np.array(np.array(a) + np.array([x7,x8])) for a in x] for x in coord]

Выход:

[[array([2, 2]), array([3, 3])],
 [array([4, 4]), array([5, 5]), array([6, 6])],
 [array([7, 7])]]
person questionto42    schedule 02.06.2021