Wybierz jeden Element w każdym wierszu tablicy Numpy według indeksów kolumn [duplikat]

to pytanie ma już odpowiedzi tutaj : NumPy wybór indeksu kolumny na wiersz za pomocą listy indeksów (6 odpowiedzi) Zamknięty 9 miesięcy temu .

Czy istnieje lepszy sposób na uzyskanie "output_array" z "input_array" i "select_id"?

Czy możemy się pozbyć range( input_array.shape[0] ) ?

>>> input_array = numpy.array( [ [3,14], [12, 5], [75, 50] ] )
>>> select_id = [0, 1, 1]
>>> print input_array
[[ 3 14]
 [12  5]
 [75 50]]

>>> output_array = input_array[  range( input_array.shape[0] ), select_id ]
>>> print output_array
[ 3  5 50]
Author: Alex Riley, 2013-06-12

4 answers

Możesz wybrać z podanej tablicy używając numpy.choose który konstruuje tablicę z tablicy indeksowej (w Twoim przypadku select_id) i zestawu tablic (w Twoim przypadku input_array) do wyboru. Może jednak być najpierw konieczna transpozycja input_array, aby dopasować wymiary. Poniżej przedstawiono mały przykład:

In [101]: input_array
Out[101]: 
array([[ 3, 14],
       [12,  5],
       [75, 50]])

In [102]: input_array.shape
Out[102]: (3, 2)

In [103]: select_id
Out[103]: [0, 1, 1]

In [104]: output_array = np.choose(select_id, input_array.T)

In [105]: output_array
Out[105]: array([ 3,  5, 50])
 31
Author: mg007,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-13 07:38:31

(bo nie mogę zamieścić tego jako komentarza do zaakceptowanej odpowiedzi)

Zauważ, że numpy.choose działa tylko wtedy, gdy masz 32 lub mniej opcji (w tym przypadku wymiar tablicy, wzdłuż której indeksujesz, musi mieć rozmiar 32 lub mniejszy). Dodatkowo dokumentacja dla numpy.choose mówi

Aby zmniejszyć szansę na błędną interpretację, nawet jeśli poniższe" nadużycie " jest nominalnie poparte, wybory nie powinny być ani nie powinny być traktowane jako pojedyncze array, tzn. zewnętrzny kontener podobny do sekwencji powinien być listą lub krotką.

OP pyta:

  1. czy jest lepszy sposób na uzyskanie output_array z input_array i select_id?
    • powiedziałbym, że sposób, w jaki pierwotnie zasugerowałeś, wydaje się najlepszy z przedstawionych tutaj. Jest łatwy do zrozumienia, skaluje się do dużych tablic i jest wydajny.
  2. Czy możemy się pozbyć range(input_array.shape[0])?
    • tak, jak pokazują inne odpowiedzi, ale zaakceptowana ogólnie nie działa tak dobrze, jak to, co OP już sugeruje.
 7
Author: Nathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-17 19:08:45

Myślę, że wyliczenie jest przydatne.

[input_array[enum, item] for enum, item in enumerate(select_id)]
 2
Author: y4suyuki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-13 13:32:55

A może:

[input_array[x,y] for x,y in zip(range(len(input_array[:,0])),select_id)]
 0
Author: atomh33ls,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-13 13:06:56