У меня есть двумерный массив 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).
В дополнение к тому, что сказали другие, вы можете изменить эти элементы с помощью необычной индексации следующим образом:
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]])
, где вы можете установить каждый элемент независимо, используя другой массив, список или кортеж того же размера.
одна работа вокруг: ndarray.flatten, np.put(), ndarray.reshape
попробуйте ndarray.flatten(array)
, таким образом, вы имеете дело с массивом с одним диммером, которым можно манипулировать с numpy.put(array,[indices],[values])
. Затем используйте ndarray.reshape()
, чтобы получить исходные размеры.