2016-12-31 6 views
2

Я иду от фона MATLAB и я пытаюсь написать в питоне/NumPy:Python3/Numpy: ndarray условная индексация

[l, m, n] = ndgrid(1:size(dct, 1), 1:size(dct, 2), 1:size(dct, 3)); 
mycell{i, j} = dct(... 
    min.^2 <= l.^2 + m.^2 + n.^2 & ... 
    l.^2 + m.^2 + n.^2 <= max.^2)'; 

Так что код должен, чтобы это принять все значения массива, которые имеют индекс (например, х, у, г), которые имеют 2-норму между min и max, т.е. min^2 < x^2 + y^2 + z^2 < max^2

Единственное, что я смог найти об индексации некоторых значений массива с условием значения массива в этом индексе, однако я хочу индексировать с условием самого индекса.

Я прочитал о вещании и функции ix_ и расширенной индексации, однако я не могу скомпоновать детали.

+0

@Divakar сделал правку, чтобы сделать вопрос яснее. – Xaser

+0

Как хорошая практика, было бы неплохо избежать имен, таких как 'min',' max', которые уже являются именами для встроенных. – Divakar

ответ

5

NumPy предлагает нам создавать открытые сетки, которые могли бы заменить 3D-сетки с помощью np.ogrid. Это по существу заменит часть ndgrid кодом MATLAB, но с дополнительными преимуществами (читайте далее для более подробной информации). Затем эти сетки могут быть квадратными и добавлены для выполнения эквивалента l.^2 + m.^2 + n.^2 без фактического создания 3D версий l, m и n, как это было сделано с ndgrid. Это огромный критерий производительности и был изучен в this previous post, и он показал преимущества производительности.

Таким образом, перенос к NumPy, мы имели бы -

m,n,r = dct.shape  
x,y,z = np.ogrid[0:m,0:n,0:r] 
vals = x**2+y**2+z**2 
mycell[i][j] = dct[(min**2 <= vals) & (vals <= max**2)] 
Смежные вопросы