2016-04-15 43 views
4

我有一個2-d張量:如何從給定的二維張量中提取n個一維張量?

一個= [[6,5,4],[3,2,1],[1,2,3],[4,5,6] ,[7,8,1],[5,2,6]

我想提取K 1-d張量隨機無重複。接着,將它們組合到另一2-d張量B:

B = [5,2,6],[3,2,1],[6,5,4]

我沒有找到這樣的任何功能,所以作爲波紋管實現:

rand_var_1 = tf.random_crop(a, size=[1, 3], seed=1) 
rand_var_2 = tf.random_crop(a, size=[1, 3], seed=2) 
rand_var_3 = tf.random_crop(a, size=[1, 3], seed=3) 
rand_var_4 = tf.random_crop(a, size=[1, 3], seed=4) 
b = tf.concat(0, [rand_var_1, rand_var_2, rand_var_3, rand_var_4]) 

b_rs = sess.run(b) 
print "b_rs:\n",b_rs 

但結果具有重複1-d張量,如:

BB = [[5,2,6] ,[3,2,1],[5,2,6]]

可以請某人幫我解決這個問題嗎?

+0

不知道這是否會與tensorflow工作,但是對於NumPy數組,它可以用'a [np.random.choice(a.shape [0],3,replace = False)]'來實現。 – Divakar

+0

這在tensorflow中不起作用,但我決定試試這個:'a_shuffled = tf.random_shuffle(a,seed = 12),b = tf.slice(a_shuffled,[0,0],[K,len( a [0])])',我認爲他們在某些方面做着同樣的事情。無論如何,謝謝你的親切幫助:)。 –

回答

2

以下應該工作,基本上產生的數字陣列的陣列a的長度,洗牌它們,並使用第一K索引,並得到了行,

import numpy as np 

#Number of samples 
K = 3 

#Array 
a =[[6, 5, 4], [3, 2, 1], [1, 2, 3], [4, 5, 6], [7, 8, 1], [5, 2, 6]] 
N = len(a) 

#Get an array on size of a, shuffle and take first K to use 
#permutation used as suggested by @EelcoHoogendoorn 
indices = np.random.permutation(N) 

#Take the first k samples 
samples = indices[:K] 
b = [a[i] for i in samples] 

#Print 
print('a = ', a) 
print('b = ', b) 
+0

numpy.random.permutation做同樣的事情,但更緊湊 –

+0

如果您使用numpy數組而不是lits列表('b = a [samples]'),語法會更好一些,但是,這似乎是明顯的做法,+1。 – Jaime

+0

好點@EelcoHoogendoorn,我已經改變爲建議的排列組合。謝謝@Jaime,我同意並最初爲'a' /'b'使用'numpy'數組,但是由於OP使用列表,似乎明智地保持相同的格式... –

相關問題