2010-08-23 3 views
45

Я использую 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. Я не мог найти его в документации и не видел подобного вопроса.

Спасибо!

ответ

29

Это, наверное, проще всего сделать x[None, 10, :] или эквивалентно (но более читаемо) x[np.newaxis, 10, :].

Насколько я понимаю, это не по умолчанию, я обнаружил, что постоянно иметь массивы с размерами синглтона очень быстро раздражает. Я предполагаю, что numpy devs чувствовали то же самое.

Кроме того, многоуровневая рукоятка широковещательных массивов очень хорошо, поэтому обычно нет причин сохранять размерность массива, из которого вышел срез. Если вы сделали, то вещи, как:

a = np.zeros((100,100,10)) 
b = np.zeros(100,10) 
a[0,:,:] = b 

либо не будет работать или будет гораздо сложнее реализовать.

(Или, по крайней мере, это мое предположение, в аргументации Numpy Дэв за падения размера информации при строгания)

+4

Это кажется неправильным ... – sebpiq

+1

На самом деле 'x [10,:, None]' возвращает массив формы '(10,1)', а не '(1,10)' .. – Lisa

+4

@Lisa: 'x [Нет, 10] 'будет делать то, что вы хотите. – naught101

13

Я нашел несколько разумных решений.

1) использовать numpy.take(X,[10],0)

2) использовать эту странную индексацию X[10:11:, :]

В идеале, это должно быть по умолчанию. Я никогда не понимал, почему размеры падают. Но это обсуждение для numpy ...

+0

Вариант № 2 довольно удивительный. –

38

Другим решением является

X[[10],:] 

или

I = array([10]) 
X[I,:] 

Размерность массив сохраняется, когда индексирование выполняется списком (или массивом) индексов. Это приятно, потому что это оставляет вам выбор между сохранением размера и сжатием.

+5

Это, безусловно, лучшее решение. – Will

+1

Это копирует данные массива – Per

+0

Это не всегда так. Смотрите: 'x = np.array ([[1,2,3,4]])' , если вы затем нарезаете его символом 'x [[0], [1,2]]' вы получаете одномерный массив ([2, 3]) 'Мое мнение заключается в выборе столбцов или векторов строк, лучше всего сделать срез простым, а затем использовать' np.reshape', поэтому в моем примере это будет 'np.reshape (x [0, [ 1,2]], [1,2]) ' – Alexander

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