Przekroczenie zakresu tablicy

0

Taki mam kod:

from sklearn import cross_validation as cv
import pandas as pd

header = ['user_id', 'movie_id', 'rating', 'timestamp']
df = pd.read_csv('../files/ratings.csv', sep=',', names=header)

n_users = df.user_id.unique().shape[0]
n_items = df.movie_id.unique().shape[0]

train_data, test_data = cv.train_test_split(df, test_size=0.20)
train_data_matrix = np.zeros((n_users, n_items)) #n_users wynosi 672, n_items 9067

for line in train_data.itertuples():
   train_data_matrix[int(line[1]) - 1, int(line[2]) - 1] = float(line[3])

Błąd, przekroczenia indeksu w train_data_matrix

IndexError: index 46971 is out of bounds for axis 1 with size 9067

Powód:
user-film-ocena w jednym wierszu więc tabela może wyglądać ( jeden uzytkownik ma kilka wierszy, rozniace sie filmem jaki oceniał ) np.

user_id | movie_id | rating
5 | 404 | 4.0
5 | 60 | 3.5
6 | 13 | 5.0

chciałbym stworzyć tablicę train_data_matrix[users_id, movies_id] o wartościach rating dla danego filmu ( czyli wierszy tyle ile użytkowników - bez powtórek, tak samo movie_id - bez powtórek )

Jak to zrobić w python 3.5 ?

0

Jako że tablica, którą tworzysz, wydaje się być potencjalnie bardzo rzadka, lepszym rozwiązaniem (prostszym w implementacji, bardziej zrozumiałym, oszczędniejszym pamięciowo) będzie słownik adresowany krotką (users_id, movies_id).

0

Ale jak to zrobic dla zwykłej tablicy dwuwymiarowej. Nie zależy mi na optymalizacji, tylko żebym mógł łatwo obrobić wzorem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1