2015-05-03 8 views
2

У меня есть матрица:В Python есть ли способ добавить за собой?

[[1 2 3], 
[4 5 6], 
[7 8 9]] 

и мне нужно, чтобы создать новую матрицу:

[[7 4 1], 
[8 5 2], 
[9 6 3]] 

Я попытался

new_matrix = [[1]] 
new_matrix.append(matrix[1][0]) 

и получил new_matrix = [4 1] вместо new_matrix = [1 4]

Если вам нужно уточните, пожалуйста, просто спросите.

+4

Добавление сзади, добавление добавляет спереди. – TankorSmash

+0

Является ли это массивным массивом? –

+0

В массивах numpy нет метода добавления, поэтому я предполагаю, что это не так. – cge

ответ

8

Да. Используйте new_matrix.insert(0,matrix[1][0]).

insert(position,value) позволяет вставлять объекты в определенные позиции в списке. В этом случае, поскольку вы хотите вставить число в начале, позиция равна нулю.

Обратите внимание, что это займет время O (n), если new_matrix имеет n элементов. Если new_matrix имеет 100 элементов, потребуется больше десяти раз, чтобы добавить что-то в начало, чем если бы оно было 10. Это намного медленнее, чем добавление чего-то в конец списка, что обычно занимает O (1): оно должно быть быстрым независимо как большой new_matrix. См. here для получения дополнительной информации о временной сложности операций python. Если вы будете регулярно добавлять элементы в начало списков, вам может понадобиться подумать о том, можете ли вы отменить то, что вы делаете.

Также обратите внимание, что так, как вы это делали, это даст вам новую_матрицу из [4, [1]]. Я не совсем уверен, чего вы хотите: если вы хотите получить окончательные результаты по мере их описания, тогда вам понадобится new_matrix = [1]. Если ваш код верен (new_matrix = [[1]]), и вы хотите [[4,1]], то вам нужно будет сделать new_matrix[0].insert(0,4). Если вы хотите [[4],[1]], вам нужно будет сделать new_matrix.insert(0,[4]) и так далее.

Как в стороне, поскольку вы, кажется, делаете что-то с матрицами, считаете ли вы, что используете numpy?


(Я хотел бы отметить, что, если этот ответ кажется немного не по теме, это потому, что этот вопрос был отредактирован, чтобы быть чем-то совершенно иное, чем первоначально просили.)

Что касается новый вопрос: хотя ответ Стефана хороший питон, вы можете слишком много работать. Понятно, что вы пытаетесь реализовать что-то вроде транспонирования матрицы, кроме зеркального отображения. Если вы делаете такие манипуляции, Numpy - много проще и быстрее. В этом случае, с Numpy массивами, вы просто должны сделать следующее:

import numpy as np # import numpy 
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # Here's your matrix 
new_matrix_1 = matrix[::-1,:] # Here's your matrix with all the rows reversed: [[7,8,9],[4,5,6],[1,2,3]] 
new_matrix = new_matrix_1.T # Here's the transpose of that, which is what you want. 

Хотя это только одна вещь, это сделает все вам сделать проще. Например, арифметика действительно будет работать: new_matrix+matrix, 2*new_matrix и т. Д. В противном случае вам придется реализовать это вручную.

+1

Альтернативно: new_matrix = [1] + matrix [1] [0] – WakkaDojo

4

Зачем строить матрицу в крошечных шагах, когда вы можете просто сделать это сразу?

>>> matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
>>> new_matrix = zip(*matrix[::-1]) 
>>> new_matrix 
[(7, 4, 1), (8, 5, 2), (9, 6, 3)] 

Или, если вам нужны строки в списках:

>>> matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
>>> new_matrix = map(list, zip(*matrix[::-1])) 
>>> new_matrix 
[[7, 4, 1], [8, 5, 2], [9, 6, 3]] 

Объяснение:

  • Сначала [::-1] меняет матрицу, т.е. превращает его с ног на голову. Это приближает нас к желаемому результату.
  • Затем zip переносит матрицу, объединяя ее строки. Первым элементом результата zip является список первого элемента каждой строки, то есть первый элемент zip - это первый столбец . И т. Д., То есть zip дает вам список столбцов, т. Е. Транспонированную матрицу.
+1

Я думаю, что объяснение того, почему вы отменили матрицу, и как zip можно использовать для транспонирования, было бы полезно здесь. Zip является мощным и имеет множество применений, но я считаю, что это трудно понять сначала без наглядной помощи. – Shashank

+0

@Shashank Хорошо, я сделал. –

+1

'reverse (matrix)' будет более эффективным –

2

От:

[[1 2 3], 
[4 5 6], 
[7 8 9]] 

в

[[7 4 1], 
[8 5 2], 
[9 6 3]] 

может быть сделано как

import numpy as np 
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) 
matrix[::-1].T 
0

Если вы в списковых и прочее:

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
result = [ [ i[k] for i in matrix[::-1] ] for k in range(len(matrix)) ]