当numpy挤压似乎没有挤压时,如何挤压?

时间:2020-06-12 10:20:41

标签: python numpy

我在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的矩阵。这可能与控制包的文档不一致。

编辑

编辑1

我真的不明白为什么这行不通。在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,)

编辑2

我当然可以找到解决方法,即此方法可行,但这很丑...

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

这里真的有我不明白/想念的东西... :(

编辑3

因此,(当然)这是一个相当大的程序的一部分。但是我可以写一个简短的片段来重现该问题。如果是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)

0 个答案:

没有答案