为什么 np.zeros

分享于2022年07月17日 arrays dimension numpy python 问答
【问题标题】:为什么 np.zeros(3) 和 np.zeros((3,1)) 在 python 中具有不同的维度?(Why np.zeros(3) and np.zeros((3,1)) are of different dimensions in python?)
【发布时间】:2022-01-27 03:40:30
【问题描述】:

我正在尝试为三个在 python 中共同正常的随机变量生成 N 个数据点。 如果我使用以下代码:

import numpy as np
import scipy
import pandas
import sys
from scipy.linalg import block_diag
from pandas import *
N=100
Sigma=np.identity(3)
Mu=np.zeros((3,1))
Z=np.random.multivariate_normal(Mu, Sigma, N)

我收到以下错误消息:

in 
    Z=np.random.multivariate_normal(Mu, Sigma, N)
  File "mtrand.pyx", line 4067, in numpy.random.mtrand.RandomState.multivariate_normal
ValueError: mean must be 1 dimensional

这意味着 np.zeros((3,1)) 的维度不是 1 。将行 Mu=np.zeros((3,1)) 更改为 Mu=np.zeros(3) 后,它可以工作。这意味着 np.zeros(3) 1 维度的。

由于 np.zeros(3) np.zeros((3,1)) 都是三个零的数组,我想自然两者都应该是一维的。在每种情况下使用 Mu.ndim ,我发现 np.zeros(3) 的维度是一, np.zeros((3,1)) 的维度是二。我的问题是:

为什么 Python 在尺寸方面区分 np.zeros((3,1)) np.zeros(3) (为什么这种区分有用)?

  • 具有 3 个标量和 3x1 矩阵的向量是不同的东西吗?这就是 1d 和 2d 的区别。
  • @CJR 谢谢!在其他一些语言中,例如 MATLAB,一个具有 3 个标量的向量和一个 3x1 矩阵是一回事。在线性代数中,它们也是一回事。它们在计算机科学中是否被视为不同的事物?
  • 线性代数认为 3 空间中的向量与 1 空间中的超定方程组相同吗?
  • @CJR 这两件事在线性代数中当然是不同的。我的意思是,在线性代数中,我们不区分具有 3 个坐标的向量和 3x1 矩阵。例如,线性代数中的$[0 0 0]^\top$既是3维向量又是3x1矩阵。
  • 在 MATLAB 中,一切都是二维的。 “标量”的大小为 (1,1)。在 numpy 中,任何维度 0-32 都是可能的。 np.zeros((1,1,3,1) 是具有 3 个元素的 4d。 Python 有标量和列表。列表是一维的,尽管它们可能是嵌套的。

【解决方案1】:

它们具有不同的尺寸是正常的。第一个只有 1 个由 3 个零组成的数组,第二个有 3 个数组,每个数组由 1 个零组成。

如果您在示例中打印 Mu[0] ,您将获得一个列表 [0.] ,而如果您在使用 np.zeros(3) 定义它后打印 Mu[0] ,您将获得 0.0

我可以想到这种区分很有用的情况,尤其是在使用机器学习中的功能时。如果我有一个大小为 1 的特征序列,我想使用维度 [n,1] 而不是 [n] 因为这有助于模型(比如说 LSTM)在序列大小和特征大小之间产生差异。

  • 多维数组不是多个数组。它仍然是后端的单个内存连续 C 数组。
  • @CJR 感谢您的澄清。你是对的,因为 numpy 在内存中分配了一个连续的数组。我只是用它来以更简单的方式解释差异。