Создание матрицы произвольного размера, где сумма строк равна 0

Из Создание матрицы произвольного размера, где сумма строк к 1?, мы можем просто нормализовать значения, разделив каждое значение в матрице на сумму всех значений, чтобы убедиться, что она равна 1.

Например:

cols, rows = 5, 5
matrix = np.random.rand(rows, cols)
matrix/matrix.sum(axis=1)[:,None]

Как создать матрицу произвольного размера, в которой сумма строк равна 0?

Я пробовал:

cols, rows = 5, 5
x = np.random.rand(rows, cols)
z = x - sum(sum(x)) / (rows*cols)

Он идет к числу, близкому к нулю, но никогда не суммирует ноль =(


person alvas    schedule 27.12.2018    source источник
comment
Я думаю, что вы никогда не получите ровно 0 из-за числовых ошибок округления, если используете float. Одним из решений было бы использование целых чисел. Есть ли причина, по которой вам нужно, чтобы он был ровно 0 вместо численного 0?   -  person tch    schedule 27.12.2018
comment
Кроме того, в вашем верхнем примере каждая строка суммируется с 1, а не вся матрица суммируется с 1.   -  person tch    schedule 27.12.2018


Ответы (1)


Вы вычитаете среднее значение x из самого себя, чтобы создать z, что даст вам матрицу, сумма которой равна 0. Чтобы получить строки, равные нулю, вы должны вычесть среднее значение строки из каждого элемента в этой строке.

cols, rows = 5, 5
x = np.random.rand(rows, cols)
z = (x - np.average(x,axis=0)).T

Этот код находит среднее значение столбцов и вычитает их, так как при вычитании одномерного массива из двумерного массива одномерный массив будет вычитаться из каждой строки. Это дает матрицу, сумма столбцов которой равна нулю, и, таким образом, транспонирование дает матрицу, сумма строк которой равна нулю.

Как упомянул Тайлер Чен, вы не получите ровно 0 из-за ошибки округления, но это поможет вам приблизиться.

Надеюсь, это поможет!

person Erik Parkinson    schedule 30.12.2018