2016-09-09 32 views
0

我有一個形狀爲(2, 5)的numpy零矩陣Anumpy的索引變量範圍

A = [[ 0., 0., 0., 0., 0.], 
    [ 0., 0., 0., 0., 0.]] 

我有大小2的另一個數組seq。這與第一軸A相同。

seq = [2, 3] 

我想創建另一個矩陣B看起來像這樣:

B = [[ 1., 1., 0., 0., 0.], 
    [ 1., 1., 1., 0., 0.]] 

B通過改變ithA第一seq[i]元素與1構建。

這是一個玩具的例子。 Aseq可能很大,因此需要效率。 如果有人知道如何在張量流中做到這一點,我會特別感激。

回答

2

可以在TensorFlow做到這一點(並與在NumPy的一些類似代碼)如下:

seq = [2, 3] 

b = tf.expand_dims(tf.range(5), 0) # A 1 x 5 matrix. 
seq_matrix = tf.expand_dims(seq, 1) # A 2 x 1 matrix. 
b_bool = tf.greater(seq_matrix, b) # A 2 x 5 bool matrix. 

B = tf.to_int32(b_bool)    # A 2 x 5 int matrix. 

輸出示例:

In [7]: b = tf.expand_dims(tf.range(5), 0) 
     [[0 1 2 3 4]] 

In [21]: b_bool = tf.greater(seq_matrix, b) 
In [22]: op = sess.run(b_bool) 
In [23]: print(op) 
[[ True True False False False] 
[ True True True False False]] 

In [24]: bint = tf.to_int32(b_bool) 
In [25]: op = sess.run(bint) 
In [26]: print(op) 
[[1 1 0 0 0] 
[1 1 1 0 0]] 
+0

'@ mrry'--我額外的感謝! – Bob

1

@mrry's溶液,表示稍有不同

In [667]: [[2],[3]]>np.arange(5) 
Out[667]: 
array([[ True, True, False, False, False], 
     [ True, True, True, False, False]], dtype=bool) 
In [668]: ([[2],[3]]>np.arange(5)).astype(int) 
Out[668]: 
array([[1, 1, 0, 0, 0], 
     [1, 1, 1, 0, 0]]) 

這個想法是將[2,3]與[0,1,2,3, 4]在'外部'的廣播意義上。結果是布爾值,可以很容易地將其更改爲0/1整數。

另一種方法是使用cumsum(或其他ufunc.accumulate功能):

In [669]: A=np.zeros((2,5)) 
In [670]: A[range(2),[2,3]]=1 
In [671]: A 
Out[671]: 
array([[ 0., 0., 1., 0., 0.], 
     [ 0., 0., 0., 1., 0.]]) 
In [672]: A.cumsum(axis=1) 
Out[672]: 
array([[ 0., 0., 1., 1., 1.], 
     [ 0., 0., 0., 1., 1.]]) 
In [673]: 1-A.cumsum(axis=1) 
Out[673]: 
array([[ 1., 1., 0., 0., 0.], 
     [ 1., 1., 1., 0., 0.]]) 

或啓動與1's變化:

In [681]: A=np.ones((2,5)) 
In [682]: A[range(2),[2,3]]=0 
In [683]: A 
Out[683]: 
array([[ 1., 1., 0., 1., 1.], 
     [ 1., 1., 1., 0., 1.]]) 
In [684]: np.minimum.accumulate(A,axis=1) 
Out[684]: 
array([[ 1., 1., 0., 0., 0.], 
     [ 1., 1., 1., 0., 0.]]) 
+0

這是一個很好的解決方案,使用numpy。 – Bob