2017-01-06 11 views
4

Ich habe versucht, den streng oberen dreieckigen Teil einer Matrix in ein Array in Tensorflow umzuwandeln. Hier ein Beispiel:Konvertiere den streng oberen dreieckigen Teil einer Matrix in ein Array in Tensorflow

Eingang:

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

Ausgang:

[2, 3, 6] 

Ich habe versucht, den folgenden Code, aber es hat nicht funktioniert (ein Fehler wurde gemeldet):

def upper_triangular_to_array(A): 
    mask = tf.matrix_band_part(tf.ones_like(A, dtype=tf.bool), 0, -1) 
    return tf.boolean_mask(A, mask) 

Danke!

+0

Was ist der Fehler, den Sie erhalten? – martianwars

Antwort

0

Ich endlich herausgefunden, wie dies mit Tensorflow zu tun.

Die Idee ist, einen Platzhalter als die boolesche Maske zu definieren und dann numpy zu verwenden, um eine boolesche Matrix an die boolesche Maske in der Laufzeit zu übergeben. Ich meinen Code teilen unten:

import tensorflow as tf 
import numpy as np 

# The matrix has size n-by-n 
n = 3 
# define a boolean mask as a placeholder 
mask = tf.placeholder(tf.bool, shape=(n, n)) 
# A is the matrix 
A = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    npmask = np.triu(np.ones((n, n), dtype=np.bool_), 1) 
    A_upper_triangular = tf.boolean_mask(A, mask) 
    print(sess.run(A_upper_triangular, feed_dict={mask: npmask})) 

Meine Python-Version ist 3.6 und meine Tensorflow Version ist 0.12.0rc1. Die Ausgabe des obigen Codes ist

[2, 3, 6] 

Diese Methode kann weiter verallgemeinert werden. Wir können mit numpy jede Art von Maske konstruieren und dann die Maske an den Tensorflow übergeben, um den interessierenden Teil des Tensors zu extrahieren.

-1

Wenn Sie mit Python 2.7, dann für eine NxN-Element-Array können Sie eine Liste Verständnis mit einem bedingten verwenden:

def upper_triangular_to_array(A): 
    N = A.shape[0] 
    return np.array([p for i, p in enumerate(A.flatten()) if i > (i/N) * (1 + N)]) 

Diese Funktion setzt voraus, dass A ein 2-dimensionaler quadratischer numpy Array ist gib das korrekte Ergebnis zurück. Es stützt sich auch auf Floor Division von ganzen Zahlen, die Sie korrigieren müssen, wenn Sie Python verwenden 3.x

+0

Das OP möchte eine 'Tensorflow' Lösung, Sie können nicht numpy – martianwars

+0

Dank kiliantics und @martianwars verwenden. Ich habe schließlich selbst eine Tensorflow-Lösung gefunden und poste meinen Code oben. –

1

Die folgende Antwort folgt genau der Antwort von @Cech_Cohomology, aber es verwendet nicht Numpy in dem Prozess, nur TensorFlow.

import tensorflow as tf 

# The matrix has size n-by-n 
n = 3 

# A is the matrix 
A = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

ones = tf.ones_like(A) 
mask_a = tf.matrix_band_part(ones, 0, -1) # Upper triangular matrix of 0s and 1s 
mask_b = tf.matrix_band_part(ones, 0, 0) # Diagonal matrix of 0s and 1s 
mask = tf.cast(mask_a - mask_b, dtype=tf.bool) # Make a bool mask 

upper_triangular_flat = tf.boolean_mask(A, mask) 

sess = tf.Session() 
print(sess.run(upper_triangular_flat)) 

Diese Ausgänge:

[2 3 6] 

Der Vorteil dieses Verfahrens besteht darin, dass, wenn der Graph ausgeführt wird, gibt es keine Notwendigkeit, eine feed_dict zu geben ist.

Verwandte Themen