2013-05-13 91 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

相关问题