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
4

4 回答 4

8

也许您正在寻找这个:

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

可以有任意数量的维度来代替省略号...

另请参阅Python Ellipsis 对象有什么作用?,以及NumPy 基本切片的文档

于 2013-05-13T19:10:37.893 回答
7

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

x 是一维的,形状为 (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, 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]])
于 2013-05-13T20:52:52.660 回答
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))
于 2013-05-13T19:18:38.747 回答
1

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

x[:1] 

这称为“切片”。在此示例中,这意味着您将数组中的所有内容从第一个元素到索引为 1 的元素(不包括在内)。

请记住,Python 具有从零开始的编号。

另一个例子可能是:

x[0:2] 

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

于 2013-05-13T20:25:58.727 回答