Подтвердить что ты не робот

Как изменить 2D-массив numpy в определенных местах без цикла?

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

 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]])

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

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

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

4b9b3361

Ответ 1

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

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

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

Чтобы получить свой "правильный" массив, вы сделаете следующее:

a[:2, 2] = 0

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

Ответ 3

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

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

Ответ 4

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