Вы можете сделать это, используя Array#reduce
:
filters.reduce((r, i) => {
r[i.filterName] = i.filterValue;
return r;
}, {});
Идея состоит в том, чтобы перебрать объект filters
и на каждой итерации назначить ключ- значение к результату.
Ваши выражения среза и диапазона также могут быть записаны как:
In [86]: nd15[2:3, 2:3]
Out[86]: array([['e22']], dtype='<U3')
In [87]: nd15[2:3, [2]]
Out[87]: array([['e22']], dtype='<U3')
In [88]: nd15[[2],2:3]
Out[88]: array([['e22']], dtype='<U3')
In [89]: nd15[[2],[2]]
Out[89]: array(['e22'], dtype='<U3')
nd15[2,2]
будет скалярным элементом 'e22'.
Но различия могут быть более ясными, если мы расширим срезы, чтобы получить массив (2,2):
In [97]: nd15[1:3, 2:4]
Out[97]:
array([['e12', 'e13'],
['e22', 'e23']], dtype='<U3')
In [98]: nd15[1:3,[2,3]]
Out[98]:
array([['e12', 'e13'],
['e22', 'e23']], dtype='<U3')
In [99]: nd15[[1,2], 2:4]
Out[99]:
array([['e12', 'e13'],
['e22', 'e23']], dtype='<U3')
In [100]: nd15[[1,2], [2,3]]
Out[100]: array(['e12', 'e23'], dtype='<U3')
Последний - диагональ, (1,2) и (2, 3) элементы.
Out[86]
и Out[97]
- views
, остальные - копии.
Вы запускаете два различных типа расширенной индексации , не осознавая этого из-за неявного преобразования range
в ndarray
.
Если у вас есть range
или list
(или любой другой действительно повторяемый) в обоих индексах, вы запускаете индексацию целочисленного массива . В этой схеме результат будет иметь ту же форму, что и переданные индексные массивы. В данном случае это одномерный массив, потому что в него преобразуются диапазоны.
Когда один индекс является итеративным, а другой - слайсом, вы запускаете форму гибридной индексации . В этом случае форма имеет комбинацию размеров из расширенного индекса (1) и среза (1). Если бы вы указали вложенный 2D-список вместо range
для расширенного индекса, вы бы получили 3D-вывод.