Как изменить двумерный массив в определенных местах без цикла? - PullRequest
26 голосов
/ 14 октября 2011

У меня есть двумерный массив, и у меня есть массивы строк и столбцов, которые должны быть установлены на определенное значение.Давайте рассмотрим следующий пример

 a = array([[1, 2, 3],
            [4, 5, 6],
            [7, 8, 9]])

Я хочу изменить записи в строках [0,2] и столбцах [1,2].Это должно привести к следующему массиву

 a = array([[1, 2, 0],
           [4, 5, 0],
           [7, 8, 9]])

Я сделал следующее, и это привело к изменению каждой последовательности столбцов в каждой строке

rows = [0,1]
cols = [2,2]
b=a[numpy.ix_(rows,columns)]

В результате следующий массив изменил каждый столбецуказанный массив

array([[1, 0, 0],
       [4, 5, 6],
       [7, 0, 0]])

Кто-нибудь может, пожалуйста, дайте мне знать, как это сделать?

Большое спасибо

РЕДАКТИРОВАТЬ: Следует отметить, чтостроки и столбцы по совпадению оказываются последовательными.На самом деле они могут быть произвольными и в любом порядке.если это row = [a, b, c] и cols = [nxz], то я хочу изменить ровно три элемента в местах (a, n), (b, x), (c, z).

Ответы [ 4 ]

23 голосов
/ 14 октября 2011

В дополнение к тому, что сказали другие, вы можете изменить эти элементы с помощью необычной индексации следующим образом:

In [39]: rows = [0,1]

In [40]: cols = [2,2]

In [41]: a = np.arange(1,10).reshape((3,3))

In [42]: a[rows,cols] = 0

In [43]: a
Out[43]: 
array([[1, 2, 0],
       [4, 5, 0],
       [7, 8, 9]])

Возможно, вы захотите прочитать документацию по индексации многомерных массивов: http://docs.scipy.org/doc/numpy/user/basics.indexing.html#indexing-multi-dimensional-arrays

Ключевой момент:

, если индексные массивы имеют совпадающую форму, и существует индексный массив для каждого измерения индексируемого массива, результирующий массив имеет ту же форму, что и индексные массивыи значения соответствуют индексу, установленному для каждой позиции в массивах индексов.

Важно, что это также позволяет вам делать такие вещи, как:

In [60]: a[rows,cols] = np.array([33,77])

In [61]: a
Out[61]: 
array([[ 1,  2, 33],
       [ 4,  5, 77],
       [ 7,  8,  9]])

, где вы можете установить каждыйЭлемент независимо использует другой массив, список или кортеж того же размера.

2 голосов
/ 14 октября 2011

Во-первых, ваше описание "правильного" массива не соответствует указанным вами столбцам и строкам ...

Чтобы получить ваш «правильный» массив, вы должны сделать это:

a[:2, 2] = 0

Чтобы изменить второй и третий столбцы первой и третьей строк (строки [0,2] и столбцы [1,2]), вы должны сделать то, что делаете ... (Ваше описание изменения строк [0,2] и столбцы [1,2] - это именно тот результат, который вы получаете, верно?)

1 голос
/ 03 ноября 2017

одна работа вокруг: ndarray.flatten, np.put(), ndarray.reshape

попробуйте ndarray.flatten(array), таким образом вы имеете дело с одним dim-массивом, которым можно манипулировать с помощью numpy.put(array,[indices],[values]). Затем используйте ndarray.reshape(), чтобы получить исходные размеры.

0 голосов
/ 14 октября 2011

Это должно быть просто: [0,2] = 0 и [1,2] = 0. Вы также можете сделать [0: 2,2] = 0. Индексирование диапазона на основе ':' в python - это полуоткрытый интервал [0,2), который в действительности находится в диапазоне от 0 до 1 (конечная точка 2 не включена).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...