2013-05-13 123 views
2

我對python比較陌生,但我想了解一些看起來很基本的東西。爲什麼不能爲單行向量x [:,0] = x [0]?

創建矢量:

x = np.linspace(0,2,3) 
Out[38]: array([ 0., 1., 2.]) 

現在爲什麼不是X [:,0]的值的參數?

IndexError: invalid index 

它必須是x [0]。我有一個函數,我正在調用哪個計算:

np.sqrt(x[:,0]**2 + x[:,1]**2 + x[:,2]**2) 

爲什麼不能輸入我的意思?它還有許多其他語言,它獨立於數組中的其他行。也許我誤解了一些根本性的東西 - 如果是的話,很抱歉。我想避免把:

if len(x) == 1: 
    norm = np.sqrt(x[0]**2 + x[1]**2 + x[2]**2) 
else: 
    norm = np.sqrt(x[:,0]**2 + x[:,1]**2 + x[:,2]**2) 

無處不在。當然有一種解決方法...謝謝。

編輯:另一種語言工作的這一個例子是Matlab的:

>> b = [1,2,3] 
b = 
    1  2  3 
>> b(:,1) 
ans = 
    1 
>> b(1) 
ans = 

    1 
+3

它不可能是真的,因爲當數組只有一個維度時,您已爲維度1指定索引,併爲維度2指定索引。 Python是顯式的而不是隱式的。用另一種語言提供示例,我們將幫助您編寫對相同隱含假設進行解釋的數組。 – Paul 2013-05-13 19:08:02

+0

請參閱編輯。 – Griff 2013-05-13 19:11:34

+1

你可以寫'x.ndim',而不是'LEN(x)的'。它不會有所作爲,但它是一個清晰可讀的名稱。 – jorgeca 2013-05-13 19:32:53

回答

3

我傾向於通過寫

x = np.atleast_2d(x) 
norm = np.sqrt(x[:,0]**2 + x[:,1]**2 + x[:,2]**2) 

Matlab的不具有一維數組來解決這個是,所以b=[1 2 3]仍然是一個二維數組和索引與兩個維度是有意義的。它對你來說可能是一個新穎的概念,但實際上它們非常有用(你可以不用擔心是否需要乘以轉置,插入一行或一列到另一個陣列中......)

由方式,你可以寫一個發燒友,更普遍的規範是這樣的:

x = np.atleast_2d(x) 
norm = np.sqrt((x**2).sum(axis=1)) 
1

問題是Python中的x [:,0]和Matlab不一樣。 如果要提取的單行向量的第一個元素,你應該

x[:1] 

這就是所謂的「切片」去了。在這個例子中,它意味着你從數組的第一個元素到索引爲1的元素(不包括)中的所有元素。

請記住,Python具有從零開始的編號。

另一個示例可以是:

x[0:2] 

它將返回第一和所述陣列的所述第二元件。

7

它看起來像由@JanneKarila描述的省略號已經回答了你的問題,但我想指出,你怎麼可能讓你的代碼更有點「numpythonic」。似乎要處理的n維陣列的形狀(D_1,D_2,...,{D_ N-1},3),並計算該集合三維矢量的大小,從而導致( N-1)維陣列的形狀(D_1,D_2,...,{D_ N-1})。一種簡單的方法是將所有元素平方,然後沿最後一個軸求和,然後取平方根。如果x是數組,該計算可以被寫入np.sqrt(np.sum(x**2, axis=-1))。以下顯示一些示例。

x是1-d,具有形狀(3):

In [31]: x = np.array([1.0, 2.0, 3.0]) 

In [32]: np.sqrt(np.sum(x**2, axis=-1)) 
Out[32]: 3.7416573867739413 

x是2-d,具有形狀(2,3):

In [33]: x = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]) 

In [34]: x 
Out[34]: 
array([[ 1., 2., 3.], 
     [ 4., 5., 6.]]) 

In [35]: np.sqrt(np.sum(x**2, axis=-1)) 
Out[35]: array([ 3.74165739, 8.77496439]) 

x是3-d ,形狀爲(2,2,3):

In [36]: x = np.arange(1.0, 13.0).reshape(2,2,3) 

In [37]: x 
Out[37]: 
array([[[ 1., 2., 3.], 
     [ 4., 5., 6.]], 

     [[ 7., 8., 9.], 
     [ 10., 11., 12.]]]) 

In [38]: np.sqrt(np.sum(x**2, axis=-1)) 
Out[38]: 
array([[ 3.74165739, 8.77496439], 
     [ 13.92838828, 19.10497317]]) 
+0

啊,這是比調用'np.atleast_2d'和我的回答沿第一軸總結好得多。 – jorgeca 2013-05-13 21:10:25

相關問題