как изменить двумерный массив 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]])

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

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

EDIT: Следует отметить, что строки и столбцы случайно оказались последовательными. На самом деле они могут быть произвольными и в любом порядке. Если это rows = [a,b,c] и cols=[n x z], то я хочу изменить ровно три элемента в местах (a,n),(b,x),(c,z).

28
задан Shan 14 October 2011 в 00:21
поделиться

2 ответа

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

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

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

24
ответ дан 28 November 2019 в 03:47
поделиться

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

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

2
ответ дан 28 November 2019 в 03:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: