2016-05-18 40 views
5

Sipariş mxn bir matris A ve mx1 bir vektör var. Her sıradaki vektörlerin elemanlarını bir ofset olarak kullanarak A matrisinin her satırındaki elemanları ayıklamak istiyorum. Örneğin Numune kullanılarak indeks vektörü kullanılarak matristen elemanlar nasıl alınır?

,
A = [[3, 0, 0, 8, 3], 
    [9, 3, 2, 2, 6], 
    [5, 5, 4, 2, 8], 
    [3, 8, 7, 1, 2], 
    [3, 9, 1, 5, 5]] 

bir vektör

y = [4,2,1,3,2] 

Ne elde etmek istiyorum I A, elemanlarını çıkarmak için bir yol istediğiniz olduğu vektör endekslerinin her bir öğe, bir herhangi bir açık döngü kullanılmadan, A'nın ilgili sırasındaki eleman, yani,

.

beklenen çıkışı,

[3,2,5,1,1] 

Python ve numpy kitaplığı kullanıyorum.

Yardımın için teşekkürler!

+0

da beklenen çıkışı eklemek Could ? – AKS

cevap

6
Bir NumPy diziye liste A dönüştürerek başlamalıdır

:

>>> import numpy as np 
>>> A = np.array([[3, 0, 0, 8, 3], 
...    [9, 3, 2, 2, 6], 
...    [5, 5, 4, 2, 8], 
...    [3, 8, 7, 1, 2], 
...    [3, 9, 1, 5, 5]]) 
... 
>>> y = [4, 2, 1, 3, 2] 

Ve bundan sonra

, hiçbir şey advanced indexing kullanarak engeller:

>>> A[np.arange(A.shape[0]), y] 
array([3, 2, 5, 1, 1]) 
>>> A[np.arange(A.shape[0]), y] = -99 
>>> A 
array([[ 3, 0, 0, 8, -99], 
     [ 9, 3, -99, 2, 6], 
     [ 5, -99, 4, 2, 8], 
     [ 3, 8, 7, -99, 2], 
     [ 3, 9, -99, 5, 5]]) 
+0

Evet, bu harika çalışıyor. Çok teşekkür ederim! –

0

Aşağıdakiler geleneksel python stiline yapışır, ancak hız için optimize edilmez. Deneyin ve kullanım durumunuz için işe yarayıp yaramadığını görün.

A = [[1, 0, 0, 6, 1], 
    [8, 2, 1, 1, 5], 
    [1, 1, 0, 0, 4], 
    [3, 8, 7, 1, 2], 
    [3, 9, 1, 5, 5]] 

b = [0, 1, 2, 3, 4] 

result = [A[i][b_i] for i, b_i in enumerate(b)] 
# -> [1, 2, 0, 1, 5]