我在numpy中有一个小脚本(Ubuntu 18.04,Python 3.6.9,numpy 1.18.3)。我想压缩一个数组,但是我不知怎么做。
看看numpy文档,np.squeeze应该能够做到这一点。所以我做了以下事情:
print(self.U.shape)
print(self.renorm_action)
to_plot = np.squeeze(self.U) / self.renorm_action
print(to_plot.shape)
它打印:
(1, 1002)
1.0
(1, 1002)
如我所料,我非常惊讶:
(1, 1002)
1.0
(1002,)
相反。知道我在做什么错吗?
感谢注释方面的巨大帮助,并期待着“答案”,但不久之后,lqr会返回一个始终为2D的矩阵。这可能与控制包的文档不一致。
我真的不明白为什么这行不通。在python3终端中,我能够做到:
$ python3
Python 3.6.9 (default, Apr 18 2020, 01:56:04)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> arr = np.zeros((1, 1002))
>>> arr.shape
(1, 1002)
>>> arr2 = np.squeeze(arr)
>>> arr2.shape
(1002,)
我当然可以找到解决方法,即此方法可行,但这很丑...
print(self.U.shape)
print(self.renorm_action)
to_plot = np.zeros((self.total_nbr_timesteps,))
to_plot[:] = np.squeeze(self.U)[0, :] / self.renorm_action
print(to_plot.shape)
打印:
(1, 1002)
1.0
(1002,)
这里真的有我不明白/想念的东西... :(
因此,(当然)这是一个相当大的程序的一部分。但是我可以写一个简短的片段来重现该问题。如果是min_ex.py
:
import numpy as np
import control
total_nbr_timesteps = 5
A = np.array([[0, 0, 1, 0],
[0, 0, 0, 1],
[-418, 0, -0.184, 0],
[0, -16343, 0, -0.767]])
B = np.array([[0],
[0],
[0.0002],
[-0.0034]])
nbr_modes = A.shape[1]
X = np.zeros((nbr_modes, total_nbr_timesteps))
Q = np.eye(nbr_modes)
R = np.array([1.0])
N = np.array([[0.0],
[0.0],
[0.0],
[0.0]])
K_lqr, _, _ = control.lqr(A, B, Q, R, N)
# K_lqr = np.ones((1, 4)) # using this matrix instead, it works
print(K_lqr.shape)
print(X.shape)
U = -K_lqr @ X
print(U.shape)
to_plot = np.squeeze(U)
print(to_plot.shape)
# this prints:
# $ python3 min_ex.py
# (1, 4)
# (4, 5)
# (1, 5)
# (1, 5)