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