2014-09-03 3 views
1

Я пытаюсь решить проблему «очень простая». Не так просто в Python. Учитывая большую матрицу А и еще меньшую матрицу BI нужно заменить некоторые элементы А с В. В Matlab это будет выглядеть следующим образом:Заменить элементы матрицы с определенными координатами в python

Given A, row_coord = [1,5,6] col_coord = [2,4], and a matrix B of size(3X2), A[row_coord, col_coord] = B 

В Python Я пытался использовать product(row_coord, col_coord) из itertools для формирования набора всех индексов, которые должны быть доступны в A, но это не работает. Все примеры подменю подматрицы относятся к блочным примерам row_coord = col_coord. Ничего конкретного, кроме http://comments.gmane.org/gmane.comp.python.numeric.general/11912, похоже, связано с проблемой, с которой я столкнулся, и код в ссылке не работает.

Примечание: Я знаю, что я могу реализовать то, что мне нужно, через double for-loop, но по моим данным такой цикл добавляет 9 секунд к запуску одной итерации, и я ищу более быстрый способ реализовать это.

Любая помощь будет принята с благодарностью.

+2

Можете ли вы предоставить некоторые примеры матриц и векторов? Они не должны быть безумно большими, достаточно для проверки. – Ffisegydd

+0

Да, конечно: A = np.zeros ([20,20]) col_coord = [0,1,3] row_coord = [1,2] B = 1 (положим B постоянным). Тривиальный способ решить эту проблему: by a in row_coord: для b в col_coord: A [row_coord [a], col_coord [b]] = 1, но я хотел бы сделать это быстрее, используя как-то утилиту intertools .. Спасибо за это :-( – user3861925

ответ

0

Предполагая, что вы используете numpy массивов затем (в случае, когда ваш B является скаляром) следующий код должен работать, чтобы назначить выбранные элементы стоимости B.

itertools.product создаст все координатные пары, которые мы затем преобразовываем в numpy массив и использовать в индексирует исходный массив:

import numpy as np 
from itertools import product 

A = np.zeros([20,20]) 

col_coord = [0,1,3] 
row_coord = [1,2] 

coords = np.array(list(product(row_coord, col_coord))) 

B = 1 

A[coords[:,0], coords[:,1]] = B 

Я использовал this excellent answer by unutbu работать, как сделать индексацию.

+0

Огромное вам спасибо! Он работает по мере необходимости. Я использовал A [product (row_coord, col_coord)] напрямую, не запустив в список и np.array, и дал мне Traceback (последний звонок последний): IndexError: индекс должен быть либо int, либо последовательностью – user3861925

+0

Прохладный, я мог бы помочь :) Если вы чувствуете, что мой ответ помог вам, вы могли бы [Принять мой ответ] (http: //meta.stackexchange. ком/а/5235/204922). – Ffisegydd