Попытка вызвать элемент в двумерном массиве в цикле while (python / numpy) - PullRequest
0 голосов
/ 24 апреля 2011

Я пытаюсь создать программу, которая сводит любую матрицу к уменьшенной форме ряда строк.

Я пытаюсь разделить каждую запись в строке на начальный номер. Например, скажем, у меня есть:

[ [3, 4, 5], [ 1, 2, 3] ]  # a 2-d array. which gives:

[ 3, 4, 5]
[ 1, 2, 3]

Я пытаюсь превратить это в [1, 4/3, 5/3]. Однако, если вы будете следовать моему коду:

def npgauss(a):
    n = 0

    for i in a[0]:
        x = a[0][0] 
        a[0][n] = a[0][n]/x 
        print a[0][n]
        n = n + 1

вы увидите, что моя проблема в том, что 1-я запись делится сама по себе, чтобы дать 1, а затем, когда она переходит ко второй записи, она делит это на новое число 1 вместо исходного числа 3 (которое что я хочу).

Я не могу найти способ обойти это! Как сделать так, чтобы оно делилось на исходное число?

Ответы [ 3 ]

3 голосов
/ 24 апреля 2011

Поскольку в вопросе упоминается numpy, вот решение без использования циклов:

import numpy
a = numpy.array([[3.,4.,5.],[1.,2.,3.]])
a = a/a[:,0:1]
print a

дает требуемый результат

array([[ 1.        ,  1.33333333,  1.66666667],
       [ 1.        ,  2.        ,  3.        ]])

Здесь есть несколько тонкостей:

  1. Я использую числа с плавающей точкой вместо целых, чтобы избежать неожиданностей с целочисленным делением при использовании Python 2
  2. Вы должны использовать a[:,0:1] вместо a[:,0], чтобы выбрать первый столбец
  3. Вы не можете писать a /= a[:,0:1], так как операторы на месте по какой-то причине трактуют рассылку массива
0 голосов
/ 24 апреля 2011

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

a = [[3, 4, 5], [1, 2, 3]]

b = [[float(i)/row[0] for i in row] for row in a]
0 голосов
/ 24 апреля 2011

Если вы хотите x зафиксировать для всего цикла, просто установите его значение, прежде чем идти в цикл:

x = a[0][0] 
for i in a[0]:
    a[0][n] = a[0][n]/x 
    print a[0][n]
    n = n + 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...