2011-07-21 16 views
9

Próbuję indeksować duże tablice 3D za pomocą dwuwymiarowej tablicy wskaźników od argmin (lub powiązanych argmax, itp. Funkcji). Oto mój przykład dane:NumPy: używaj tablicy indeksu 2D z argmin w plasterku 3D

import numpy as np 
shape3d = (16, 500, 335) 
shapelen = reduce(lambda x, y: x*y, shape3d) 

# 3D array of [random] source integers 
intcube = np.random.uniform(2, 50, shapelen).astype('i').reshape(shape3d) 

# 2D array of indices of minimum value along first axis 
minax0 = intcube.argmin(axis=0) 

# Another 3D array where I'd like to use the indices from minax0 
othercube = np.zeros(shape3d) 

# A 2D array of [random] values I'd like to assign in othercube 
some2d = np.empty(shape3d[1:]) 

W tym momencie obie tablice 3D mają taki sam kształt, podczas gdy tablica ma kształt minax0 (500, 335). Teraz chciałbym przypisać wartości z tablicy 2D some2d do tablicy 3D othercube przy użyciu minax0 dla pozycji indeksu pierwszego wymiaru. To, co próbuję, ale nie działa:

othercube[minax0] = some2d # or 
othercube[minax0,:] = some2d 

wyrzuca błąd:

ValueError: dimensions too large in fancy indexing

Uwaga: czym obecnie używam, ale nie jest bardzo NumPythonic:

for r in range(shape3d[1]): 
    for c in range(shape3d[2]): 
     othercube[minax0[r, c], r, c] = some2d[r, c] 

Kopałem w Internecie, aby znaleźć podobne przykłady, które mogą indeksować othercube, ale nie znajduję niczego eleganckiego. Czy wymagałoby to advanced index? Jakieś wskazówki?

+0

Dziękuję za to, że miał ten problem! Mój dzień jest lepszy na odpowiedź, którą wywołał. – Richard

Odpowiedz

9

wymyślne indeksowanie może być trochę nieintuicyjne. Na szczęście model tutorial ma kilka dobrych przykładów.

Zasadniczo konieczne jest zdefiniowanie j i k, gdzie mają zastosowanie poniższe minidx. numpy nie wywnioskuje go z kształtu.

w przykładzie:

i = minax0 
k,j = np.meshgrid(np.arange(335), np.arange(500)) 
othercube[i,j,k] = some2d 
+0

W jaki sposób to działa na tablice indeksów 3D z tablicy 4D? – Elvin

Powiązane problemy