2011-11-09 128 views
1

考慮以下方便循環成語。返回子陣列

import numpy 

print "shape of" 
x = numpy.array([['a', 'b'], ['c', 'd']]) 
print x 
print "is", x.shape 
for row in x: 
    print "shape of", row, "is", row.shape 

這給

shape of 
[['a' 'b'] 
['c' 'd']] 
is (2, 2) 
shape of ['a' 'b'] is (2,) 
shape of ['c' 'd'] is (2,) 

我的問題是,一個可以保存方便for row in x成語在返回其具有形狀(2,1)的陣列,在這種情況下?謝謝。 將子陣列的形狀從(2,)轉換爲(2,0)的函數會很好。例如。

for row in x: 
    print "shape of", somefunc(row), "is", row.shape 

返回

shape of ['a' 'b'] is (2,1) 
+0

@Woltan:對,編輯。謝謝。 –

回答

1

我不明白你爲什麼會想這一點,但你可以試試這個:

for row in x: 
    print "shape of", row, "is", numpy.reshape(row, (1, row.size)).shape 

在我optinion,一維數組更容易處理。所以把它重新塑造成「1d矩陣」並沒有什麼意義。

+0

謝謝,但我想你的意思是寫'(row.size,1)'。 –

+0

@FaheemMitha由於'['a''b']'是行向量,它應該是'(1,number_of_elements)'。 – Woltan

+0

你說得對。順便說一句,我有一個函數,需要一個2D數組,所以我別無選擇,只能改變尺寸。 –

2

您可以使用numpy.expand_dim增加任何numpy的陣列的排名:

In [7]: x=np.array([1,2,3,4]) 

In [8]: x.shape 
Out[8]: (4,) 

In [9]: np.expand_dims(x,axis=-1).shape 
Out[9]: (4, 1) 
+0

這是一個很好的解決方案。它與整體重塑相比如何? –

+0

@FaheemMitha既然'expand_dims'和'reshape'都不會將數組複製到內存中的新位置,那麼這兩種方法都是等價的。所以它歸結爲一個你喜歡的味道問題。 – Woltan

+0

@沃爾坦:「重塑」不是更普遍嗎? –