2014-10-02 2 views
1

Я хочу выбрать подматрицу в соответствии с индексом индексов индексов и строк.numpy select submatrix в соответствии с индексом

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

Как я могу это решить?

>>> X.shape 
(1000, 30) 
>>> type(X) 
<class 'numpy.ndarray'> 
>>> X 
array([[ 0.06349252, -0.19222932, -0.51720414, ..., 0.17566853, 
     0.15821072, 0.0478738 ], 
     [ 0.88497758, 0.22215627, 1.63248497, ..., 0.77716638, 
     0.76535743, 0.11670681], 
     [ 0.13308973, -0.12106689, -0.51353645, ..., 1.32546684, 
     0.8276816 , 1.25001549], 
     ..., 
     [-0.25907157, -0.24458445, -0.87298188, ..., 0.6467455 , 
     0.43216921, 0.57972136], 
     [ 1.23272918, 0.14475037, 0.16869452, ..., 0.27710557, 
     -1.39863587, -0.10482702], 
     [-0.57754589, 0.77061869, 1.88473625, ..., 0.31680682, 
     1.64699058, 0.92152533]]) 
>>> j = np.random.choice(10, 5) 
>>> i = np.random.choice(10,1000) 
>>> X[i, :] 
array([[-0.90775982, 0.82286474, -0.94136182, ..., 1.11494763, 
     0.04252439, 1.08999938], 
     [-2.51998203, -0.47154878, -0.88228892, ..., -0.03526119, 
     0.40444398, 0.27545503], 
     [-0.90775982, 0.82286474, -0.94136182, ..., 1.11494763, 
     0.04252439, 1.08999938], 
     ..., 
     [ 0.29236619, -1.53595325, 0.77567467, ..., 0.45090184, 
     1.49180382, 1.04571078], 
     [ 0.13308973, -0.12106689, -0.51353645, ..., 1.32546684, 
     0.8276816 , 1.25001549], 
     [ 0.57790133, -1.11712824, -0.47716697, ..., 0.27169274, 
     -0.84223531, -0.99293644]]) 
>>> X[:, j] 
array([[-0.51720414, 0.60436212, 0.54243319, 0.06349252, -0.19222932], 
     [ 1.63248497, -0.75034999, -0.41102324, 0.88497758, 0.22215627], 
     [-0.51353645, 0.74373642, -0.76499708, 0.13308973, -0.12106689], 
     ..., 
     [-0.87298188, -0.14638175, 0.0278893 , -0.25907157, -0.24458445], 
     [ 0.16869452, -0.42747292, 0.49202016, 1.23272918, 0.14475037], 
     [ 1.88473625, -0.21566782, -0.52799588, -0.57754589, 0.77061869]]) 
>>> X[i, j] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: shape mismatch: objects cannot be broadcast to a single shape 
>>> 
+0

Вы можете использовать срезы наподобие: 'a [i1: i2, j1: j2]' ... –

+0

@SaulloCastro, так что в основном numpy не поддерживает индексирование по обоим измерениям? – Donbeo

ответ

2

Я думаю, вы должны индексировать их отдельно:

X[i, :][:, j] 

Проблема заключается в том, что NumPy пытается сопоставить каждый индекс строки в i с соответствующим индексом столбца в j, но они не являются той же длины.

Например, X[(1, 2), (3, 4)] выберет элементы X[1, 3] и X[2, 4], но X[(1, 2), (3, 4, 5)] будет несовпадающим.

+0

Это влияние на производительность? – Donbeo

+0

@Donbeo Вероятно, это незначительное влияние. [Этот метод] (http://stackoverflow.com/a/22927889/645956) может быть быстрее. – grc

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