Я использую numpy и хочу проиндексировать строку без потери информации об измерении.
import numpy as np
X = np.zeros((100,10))
X.shape # >> (100, 10)
xslice = X[10,:]
xslice.shape # >> (10,)
В этом примере xslice теперь имеет 1 измерение, но я хочу, чтобы оно было (1,10). В R я бы использовал X [10,:, drop = F]. Есть ли что-то подобное в numpy. Я не смог найти его в документации и не видел подобного вопроса.
Благодарность!
x[None, 10]
буду делать то, что ты хочешь.None
s рядом с тусклыми лампами, которые вы рубите.b
; так и должно бытьb = np.zeros((100,10))
.X[10,None]
(используя ваш код в качестве примера).np.matmul()
или@
). Просто обгорел от этого.Другое решение - сделать
X[[10],:]
или
I = array([10]) X[I,:]
Размерность массива сохраняется, когда индексирование выполняется списком (или массивом) индексов. Это приятно, потому что оставляет вам выбор между сохранением размера и сжатием.
источник
x = np.array([[1,2,3,4]])
если вы затем нарезать его сx[[0],[1,2]]
вами получаем одномерноеarray([2, 3])
Мое мнение при выборе столбцов или строк векторов это лучше всего , чтобы сделать срез простой , а затем использоватьnp.reshape
, Так что в моем примере это будетnp.reshape(x[0,[1,2]],[1,2])
X[[10]]
будет интерпретироваться какX[10]
и форма будет меньше; точно так жеX[[10, 20]] == X[10, 20]
и форма еще меньшеa
форма(10, 20, 30)
, тоa[0, :, [0]]
будет форма(1, 20)
, а не форма ,(20, 1)
потому что в последнем транслируются индексы,a[[0], :, [0]]
что часто не совсем то, что вы ожидаете! Тогда какa[0, :, :1]
даст вам(20, 1)
как положено. Более того, см. Комментарий выше для странного крайнего случая с одним индексом. В целом кажется, что у этого метода слишком много крайних случаев.Я нашел несколько разумных решений.
1) использовать
numpy.take(X,[10],0)
2) используйте эту странную индексацию
X[10:11:, :]
В идеале это должно быть значение по умолчанию. Я так и не понял, зачем вообще сбрасываются габариты. Но это обсуждение numpy ...
источник
alist[0]
и сохраняются при их разрезании.slice(n, n+1)
извлечение индексаn
) должен быть принятым ответом, поскольку он единственный, который естественным образом распространяется на n-мерный случай.X[10:11, :]
в Python 3.7.5 (то есть без лишнего двоеточия после 11)Вот альтернатива, которая мне больше нравится. Вместо индексации с одним числом, индексируйте с диапазоном. То есть использовать
X[10:11,:]
. (Обратите внимание, что10:11
не включает 11).import numpy as np X = np.zeros((100,10)) X.shape # >> (100, 10) xslice = X[10:11,:] xslice.shape # >> (1,10)
Это упрощает понимание с большим количеством измерений, без
None
жонглирования и выяснения, какую ось использовать, какой индекс. Также нет необходимости вести дополнительный учет размера массива, простоi:i+1
для любого,i
который вы использовали бы при обычном индексировании.b = np.ones((2, 3, 4)) b.shape # >> (2, 3, 4) b[1:2,:,:].shape # >> (1, 3, 4) b[:, 2:3, :].shape . # >> (2, 1, 4)
источник
Чтобы добавить к решению, включающему индексацию списками или массивами по gnebehay, также можно использовать кортежи:
X[(10,),:]
источник
Это особенно раздражает, если вы индексируете массив, длина которого во время выполнения может быть равна 1. В этом случае есть
np.ix_
:источник