2016-07-04 4 views
1

Мне нужно сравнить кучу Numpy массивов с разными размерами, скажем:Массив индексных массивов неизвестных размеров?

a = np.array([1,2,3]) 
b = np.array([1,2,3],[4,5,6]) 
assert(a == b[0]) 

Как я могу это сделать, если я не знаю, либо форму а и Ь, кроме того, что

len(shape(a)) == len(shape(b)) - 1 

, и я также не знаю, какое измерение пропустить из b. Я хотел бы использовать np.index_exp, но это не похоже, чтобы помочь мне ...

def compare_arrays(a,b,skip_row): 
    u = np.index_exp[ ... ] 
    assert(a[:] == b[u]) 

Редактировать Или, выражаясь иначе, я wan't построить нарезка, если я знаю, что форма массив и размер, который я хочу пропустить. Как мне динамически создать np.index_exp, если я знаю количество измерений и позиций, где поставить «:» и где поставить «0».

+0

np.take что вы ищете? –

+0

Спасибо, np.take, похоже, работает на данной оси. Я мог бы использовать его, но как мне дать «:» для определения диапазона? – kakk11

+0

Что вы подразумеваете под 'skip row' или линией? Или вы имеете в виду пропустить измерение? – hpaulj

ответ

1

Я просто смотрел код для apply_along_axis и apply_over_axis, изучая, как они строят объекты индексирования.

Позволяет сделать 4d массив:

In [355]: b=np.ones((2,3,4,3),int) 

Составьте список slices (используя список * копировщика)

In [356]: ind=[slice(None)]*b.ndim 

In [357]: b[ind].shape # same as b[:,:,:,:] 
Out[357]: (2, 3, 4, 3) 

In [358]: ind[2]=2  # replace one slice with index 

In [359]: b[ind].shape # a slice, indexing on the third dim 
Out[359]: (2, 3, 3) 

Или с вашим примером

In [361]: b = np.array([1,2,3],[4,5,6]) # missing [] 
... 
TypeError: data type not understood 

In [362]: b = np.array([[1,2,3],[4,5,6]]) 

In [366]: ind=[slice(None)]*b.ndim  
In [367]: ind[0]=0 
In [368]: a==b[ind] 
Out[368]: array([ True, True, True], dtype=bool) 

Эта индексация в основном то же, что и np.take, но та же идея может быть распространена и на другие ca SES.

Я не совсем понимаю ваши вопросы об использовании :. Обратите внимание: при создании списка индексирования я использую slice(None). Интерпретатор переводит всю индексацию : в slice объектов: [start:stop:step] => slice(start, stop, step).

Обычно вам не нужно использовать a[:]==b[0]; a==b[0] достаточно. Со списками alist[:] делает копию, с массивами она ничего не делает (если не используется в RHS, a[:]=...).

+0

Большое спасибо. Похоже, я не знал о конструкции «slice()», с этим я действительно могу построить любой вид и любые индексы измерения, совершенные! – kakk11