Как изменить 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).
Ответы
Ответ 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 не включена).