2017-02-05 3 views
0

У меня есть следующие Numpy матрицы:Перебор Numpy столбцов матрицы

 0  1  2  3  4  5  6  7  8  9  
0  0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
1  0.0 0.0 5.0 0.0 9.0 0.0 0.0 0.0 0.0 0.0 
2  0.0 0.0 0.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 
3  0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 0.0 
4  0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
5  0.0 0.0 7.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 
6  0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
7  5.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 0.0 0.0 
8  2.0 0.0 0.0 0.0 3.0 0.0 6.0 0.0 8.0 0.0 
9  0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
10  0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 

Я хочу, чтобы вычислить среднее ненулевые значения каждой строки и столбца отдельно. Так что мой результат должен быть что-то вроде этого:

average_rows = [1.0,7.0,2.0,5.0,0.0,4.0,0.0,5.5,4.75,1.0,0.0] 
average_cols = [3.5,1.0,4.33333,0.0,4.33333,0.0,4.0,6.0,6.5,0.0] 

Я не могу понять, как перебрать их, и я получаю TypeError: unhashable type

Кроме того, я не уверен, что если итерация является лучшим решением , Я также попробовал что-то вроде R[:,i], чтобы захватить каждый столбец и суммировать его с помощью sum(R[:,i]), но продолжайте получать ту же ошибку.

+0

Как вы получили этот аккуратный табличный дисплей? Это не нормальный 'numpy'. С ярлыками строк и столбцов это выглядит как 'pandas'. Что ** точно ** вы подразумеваете под «матрицей»? – hpaulj

+0

Это много. Я начинаю с «R = np.zeros ((Rrows, Rcols))», затем повторяет и заполняет ненулевые значения, это в основном разреженная матрица. Он может быть хорошо отображен, так как я использую ipython notebook. – BKS

+0

Хорошо, я использую Ipython всего, но не ноутбук. Но если это «R», я не вижу, откуда приходит ошибка «unhashable». Когда вы сообщаете об ошибках, вы должны показывать хотя бы часть стека ошибок и строку кода, которая его создала. – hpaulj

ответ

1

Лучше использовать 2d np.array вместо матрицы.

import numpy as np 
data = np.array([[1, 2, 0], [0, 0, 1], [0, 2, 4]], dtype='float') 
data[data == 0] = np.nan 
# replace all zeroes with `nan`'s to skip them 
# [[ 1. 2. nan] 
# [ nan nan 1.] 
# [ nan 2. 4.]] 
np.nanmean(data, axis=0) 
# array([ 1. , 2. , 2.5]) 
np.nanmean(data, axis=1) 
# array([ 1.5, 1. , 3. ]) 
+0

Это большая матрица, которую я имею (9 000 x 15 000). И я не уверен, как изменить его на np.array. – BKS

+0

Просто подайте его в 'np.array':' np.array (np.matrix ([[1, 2, 3], [4, 5, 6]])) '. 'np.array' отлично подходит для работы с большими массивами 2d. –

+0

Единственная причина, по которой существует 'np.matrix', - это ее поведение с оператором' * ': вместо матричного умножения вместо' np.matrix' выполняется умножение матрицы. Но теперь у нас есть '@', чтобы сделать матричное умножение, поэтому нам вообще не нужно 'np.matrix'. –

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