Python 为什么可以';对于单行向量,t x[:,0]=x[0]?

Python 为什么可以';对于单行向量,t x[:,0]=x[0]?,python,vector,numpy,Python,Vector,Numpy,我对python比较陌生,但我试图理解一些基本的东西 创建一个向量: 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) 为什么我所拥有的不能是真实的,不管输入是什么?它可以使用许多其他语言,与数组中的其他行无关。

我对python比较陌生,但我试图理解一些基本的东西

创建一个向量:

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

也许你正在寻找这个:

np.sqrt(x[...,0]**2 + x[...,1]**2 + x[...,2]**2)
可以有任意数量的尺寸来代替省略号


另请参见,我倾向于通过写作来解决这个问题

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))

问题在于Python中的x[:,0]与Matlab中的不同。 如果要提取单行向量中的第一个元素,应该使用

x[:1] 
这被称为“切片”。在本例中,这意味着您获取数组中的所有内容,从第一个元素到索引为1(不包括)的元素

请记住,Python具有基于零的编号

另一个例子可能是:

x[0:2] 

它将返回数组的第一个和第二个元素。

看起来@JanneKarila所描述的省略号已经回答了您的问题,但我想指出如何使您的代码更“numpythonic”。似乎您希望处理具有形状(d_1,d_2,…,d_{n-1},3)的n维数组,并计算此三维向量集合的大小,从而生成具有形状(d_1,d_2,…,d_{n-1})的(n-1)维数组。一个简单的方法是将所有元素平方,然后沿最后一个轴求和,然后取平方根。如果
x
是数组,则可以编写该计算
np.sqrt(np.sum(x**2,axis=-1))
。下面是几个例子

x为一维,形状为(3,):

x为二维,形状为(2,3):

x为三维,形状为(2,2,3):


这不可能是真的,因为当数组只有一个维度时,您为维度1指定了索引,为维度2指定了索引。Python是显式的而不是隐式的。用另一种语言提供一个示例,我们将帮助您编写对数组的解释,使其具有相同的隐式假设。您可以编写
x.ndim
而不是
len(x)
。它不会有什么区别,但它是一个清晰易读的名称。啊,这比调用
np.至少\u 2d
并沿着第一个轴求和要好得多,就像我在回答中那样。
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
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])
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]])