2013-07-11 2 views
2

Есть ли способ изменить массив numpy внутри столбца цикла по столбцу?Изменение столбца массива numpy по столбцу внутри цикла

Я ожидаю, что это может быть сделано с помощью какой-то такой код:

import numpy as n 

cnA=n.array([[10,20]]).T 
mnX=n.array([[1,2],[3,4]]) 
for cnX in n.nditer(mnX.T, <some params>): 
    cnX = cnX+cnA 

Какие параметры следует использовать для получения mnX=[[10,23],[12,24]]?

Я знаю, что эта проблема может быть решена с помощью следующего кода:

cnA=n.array([10,20]) 
mnX=n.array([[1,2],[3,4]]) 
for col in range(mnX.shape[1]): 
    mnX[:,col] = mnX[:,col]+cnA 

Hovewer, в питоных мы перебрать модифицированные объекты, а не индексы, поэтому вопрос - можно перебрать столбцы (которые должны быть изменены на месте) напрямую?

+0

Знаете ли вы, что синтаксис разрезания массива numpy? http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#arrays-indexing – DaveP

+0

Вы говорите, что матрица, но ваш код говорит ndarray? Это две разные вещи. – usethedeathstar

+0

Спасибо. Я исправил и расширил свой вопрос. – Apogentus

ответ

4

Просто, чтобы вы знали, некоторые из нас, в Python, выполняют итерацию по индексам и не изменяют объекты, когда это полезно. Хотя в NumPy, как правило, мы явно не перебирать, если нет другого выхода: для вашей проблемы, самый простой подход должен был бы пропустить итерацию и полагаться на вещание:

mnX += cnA 

Если вы настаивайте на итерации, я думаю, что самым простым было бы перебрать по транспонированному массиву:

for col in mnX.T: 
    col += cnA[:, 0].T 
+0

Спасибо, Хайме. Конечно, я мог использовать трансляцию для этой простой задачи, но в моей первоначальной задаче мне нужно сделать более сложную работу над столбцом. Мне действительно нужно знать синтаксис, как изменять массив mnX путем изменения его столбца по столбцу на месте без использования индексов столбцов. Ваш пример оставляет mnX без изменений. – Apogentus

+0

@ Пример Apogentus Jaime модифицирует 'mnX':' col' - это вид 'mnX', а его изменение inplace (' + = ') изменяет' mnX'. Фактически, это именно «модифицировать [ING] массив mnX, изменяя его столбцом по столбцу на месте без использования индексов столбцов». – jorgeca

+0

Протестировано ... Оно работает и полностью отвечает на мой вопрос! Спасибо! – Apogentus

Смежные вопросы