2017-10-13 2 views
1

Compte tenu de l'entréeSuppression d'éléments de la diagonale d'un tableau numpy

A = np.array([[1,2,3],[4,5,6],[7,8,9]]) 
array([[1, 2, 3], 
     [4, 5, 6], 
     [7, 8, 9]]) 

Besoin sortie:

array([[2, 3], 
     [4, 6], 
     [7, 8]]) 

Il est facile à utiliser itération ou boucle pour ce faire, mais il devrait y avoir une belle façon de faire ceci sans utiliser de boucles. Merci

+0

Bienvenue à SO. Malheureusement, ce n'est pas un service d'écriture de code. S'il vous plaît, prenez le temps de lire [ask] et les liens qu'il contient. – wwii

Répondre

3

Approche # 1

Une approche avec masking -

A[~np.eye(A.shape[0],dtype=bool)].reshape(A.shape[0],-1) 

run échantillon -

In [395]: A 
Out[395]: 
array([[1, 2, 3], 
     [4, 5, 6], 
     [7, 8, 9]]) 

In [396]: A[~np.eye(A.shape[0],dtype=bool)].reshape(A.shape[0],-1) 
Out[396]: 
array([[2, 3], 
     [4, 6], 
     [7, 8]]) 

Approche # 2

Usin g le motif régulier d'éléments non diagonaux qui pourrait être tracée avec des additifs diffusés avec les tableaux de la gamme -

m = A.shape[0] 
idx = (np.arange(1,m+1) + (m+1)*np.arange(m-1)[:,None]).reshape(m,-1) 
out = A.ravel()[idx] 

Approche n ° 3 (Strides frappes!)

Abusing le motif régulier d'éléments non diagonaux de l'approche précédente, nous pouvons introduire np.lib.stride_tricks.as_strided et aide slicing, comme si -

m = A.shape[0] 
strided = np.lib.stride_tricks.as_strided 
s0,s1 = A.strides 
out = strided(A.ravel()[1:], shape=(m-1,m), strides=(s0+s1,s1)).reshape(m,-1) 

Test d'exécution

approches comme funcs:

def skip_diag_masking(A): 
    return A[~np.eye(A.shape[0],dtype=bool)].reshape(A.shape[0],-1) 

def skip_diag_broadcasting(A): 
    m = A.shape[0] 
    idx = (np.arange(1,m+1) + (m+1)*np.arange(m-1)[:,None]).reshape(m,-1) 
    return A.ravel()[idx] 

def skip_diag_strided(A): 
    m = A.shape[0] 
    strided = np.lib.stride_tricks.as_strided 
    s0,s1 = A.strides 
    return strided(A.ravel()[1:], shape=(m-1,m), strides=(s0+s1,s1)).reshape(m,-1) 

Timings -

In [528]: A = np.random.randint(11,99,(5000,5000)) 

In [529]: %timeit skip_diag_masking(A) 
    ...: %timeit skip_diag_broadcasting(A) 
    ...: %timeit skip_diag_strided(A) 
    ...: 
10 loops, best of 3: 56.1 ms per loop 
10 loops, best of 3: 82.1 ms per loop 
10 loops, best of 3: 32.6 ms per loop 
0

L'autre approche consiste à utiliser numpy.delete(). en supposant la matrice carrée, vous pouvez utiliser:

numpy.delete(A,range(0,A.shape[0]**2,A.shape[0])).reshape(A.shape[0],A.shape[1]-1)