Случай 1: От массива numpy до coo_matrix:
ar = np.array([['user1', 'product1'], ['user2', 'product2'], ['user3', 'product3'], ['user1', 'product4'],['user4','product5'],['user4','product1']])
ar
> array([['user1', 'product1'],
> ['user2', 'product2'],
> ['user3', 'product3'],
> ['user1', 'product4'],
> ['user4', 'product5'],
> ['user4', 'product1']], dtype='|S8')
затем создайте coo_matrix:
rows, r_pos = np.unique(ar[:,0], return_inverse=True)
cols, c_pos = np.unique(ar[:,1], return_inverse=True)
s = sparse.coo_matrix((np.ones(r_pos.shape,int), (r_pos, c_pos)))
print s
Дает:
(0, 0) 1
(1, 1) 1
(2, 2) 1
(0, 3) 1
(3, 4) 1
(3, 0) 1
Случай 2: Те же элементы массива, но для DataFrame, а затем для разреженной матрицы (этот случай мне нужен для правильной работы, потому что изначально у меня есть данные в DataFrame, а не как массив numpy).
df1 = pd.DataFrame(ar, columns = ['user_id','product_id'])
ar1 = np.array(df1.to_records(index=False))
ar1
Дает:
array([('user1', 'product1'), ('user2', 'product2'),
('user3', 'product3'), ('user1', 'product4'),
('user4', 'product5'), ('user4', 'product1')],
dtype=(numpy.record, [(u'user_id', 'O'), (u'product_id', 'O')]))
Создать coo_matrix:
rows, r_pos = np.unique(ar1[:,0], return_inverse=True)
cols, c_pos = np.unique(ar1[:,1], return_inverse=True)
s = sparse.coo_matrix((np.ones(r_pos.shape,int), (r_pos, c_pos)))
print s
Выход:
IndexErrorTraceback (most recent call last)
<ipython-input-211-75a151d3e431> in <module>()
----> 1 rows, r_pos = np.unique(ar1[:,0], return_inverse=True)
2 cols, c_pos = np.unique(ar1[:,1], return_inverse=True)
3 s = sparse.coo_matrix((np.ones(r_pos.shape,int), (r_pos, c_pos)))
4 print s
IndexError: too many indices for array
Почему я получаю эту IndexError? Единственное различие между этими двумя случаями заключается в dtype , но я не понял, как его изменить, чтобы оно работало для case 2 .