当列可能是向量或矩阵时,使用冒号运算符对numpy中的列进行切片



我有两个通用函数Estability3和Lstability3,其中我想评估数组的二维切片和向量的一维范围。我已经在jupyter笔记本中探讨了函数外的错误,其中包含了函数的一些参数。

这些函数计算能量和角动量。计算能量和角动量所需的位置和速度数据存储在一个名为xvec的二维矩阵中,其中位置和速度沿着一行,三个条目表示三星。xvec0是模拟的初始数据(时间步长0(。

xvec0
array([[-5.00000000e+00, 0.00000000e+00, 0.00000000e+00, -0.00000000e+00, -2.23606798e+00, 0.00000000e+00],
[ 5.00000000e+00, 0.00000000e+00, 0.00000000e+00, -0.00000000e+00, 2.23606798e+00, 0.00000000e+00], 
[ 9.95024876e+02, 0.00000000e+00, 0.00000000e+00, -0.00000000e+00, 4.46099737e-01, 0.00000000e+00]])

我通过选择这个矩阵的第一行来选择第0个时间步长的第一颗星。如果我像往常一样在数千个时间步长上循环,我会使用数千个这样的矩阵,并将它们附加到列表中,然后转换为具有数千列的numpy数组。(因此xvec1_0将有数千列,而不是一列(。

xvec1_0=xvec0[0]

由于xvec1_0只有一列,因此我试图强制numpy将其识别为矩阵。它不起作用。

np.reshape(xvec1_0,(1,6))
array([[-5.        ,  0.        ,  0.        , -0.        , -2.23606798,
0.        ]])

我看到它有两个外括号,这意味着它是一个矩阵。但是,当我尝试在一列上使用冒号索引时,就像我通常在1000列上使用的那样,我会得到一个错误。

xvec1_0[:,0:3]
IndexError                                Traceback (most recent call last)
<ipython-input-115-79d26475ac10> in <module>
----> 1 xvec1_0[:,0:3]
IndexError: too many indices for array

为什么我不能使用:运算符来获取这个二维数组的第一行?在这个同样适用于矩阵的更通用的代码中,我该如何做到这一点?

谢谢,Steven

我想我误读了整形的函数定义。我以为它改变了它的位置。没有,我需要分配一个输出,比如这个

xvec0_1 = np.reshape(xvec1_0,(1,6))
xvec1_0[:,0:3]
array([[-5.,  0.,  0.]])
xvec1_0
array([[-5.        ,  0.        ,  0.        , -0.        , -2.23606798,
0.        ]])
xvec1_0.shape
(1, 6)

多亏了一位朋友的帮助,我发现以下方法很好用。

import numpy as np
x = np.zeros((1,6))
print(x.shape)
print(x[:,0:3])
x[:,0:3]
(1, 6)
[[0. 0. 0.]]
array([[0., 0., 0.]])
x = np.zeros((6,))
print(x.shape)
x = np.reshape(x, (1,6))
print(x[:,0:3])
x[:,0:3]
(6,)
[[0. 0. 0.]]
array([[0., 0., 0.]])

也许我应该考虑一下其中的一些测试,但当我看到np.reshape的输出时,我认为我已经找到了最基本的测试。我真的很感谢朋友的帮助,希望我的问题不要太浪费任何人的时间。

最新更新