np.matrix(np.array([0,0])) 和 np.matrix([0,0]) 有区别吗?

3

我在阅读这篇关于从头开始实现线性回归的代码

# convert from data frames to numpy matrices
X = np.matrix(X.values)
y = np.matrix(y.values)
theta = np.matrix(np.array([0,0]))

当我看到这一行时:

当我遇到了这样的代码:

np.matrix(np.array([0,0]))

我在想为什么这个人不直接写np.matrix([0,0])
我在jupyter notebook中运行两者,得到相同的输出:
theta = np.matrix([0,0])
theta2 = np.matrix(np.array([0,0]))
print(theta,theta2,type(theta),type(theta2))

输出结果:[[0 0]] [[0 0]] <class 'numpy.matrix'> <class 'numpy.matrix'>

这两者之间有区别吗?np.array的额外部分是否会增加theta的功能?如果我用后者替换前者,最终代码是否能正常运行?


3
那是在2014年写的。现在np.matrix已经有了一个“PendingDepricationWarning”警告。我认为演示作者只是使用了他习惯的编码风格,没有经过一群 Stack Overflow 读者的调试。 - hpaulj
2个回答

3

很奇怪,matrix(array([0,0]))会创建一个干净的对象,该对象拥有其数据

>>> np.matrix(np.array([0,0])).flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : True
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False
>>> np.matrix(np.array([0,0])).base

然而,matrix([0,0])似乎是一个匿名数组的视图。

>>> np.matrix([0,0]).flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : True
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False
>>> np.matrix([0,0]).base
array([0, 0])

因此,在matrix(array(..))中使用额外的array似乎避免了混乱,尽管这其中更深层次的原因对我来说仍然是神秘的。

3
np.matrixcopy=True参数,np.asmatrix默认False不复制。matrix.__new__返回ndarray输入并根据此副本进行最终形状调整。其他data必须经过np.array(data, ...)后跟一个ndarray.__new__调用。请查看numpy/matrixlib/defmatrix.py代码以获取更多详细信息。 - hpaulj
实际上,两者都使用np.array将列表转换为数组。其余部分只是将该数组强制转换为matrix子类。从一个大列表开始,我没有看到显着的时间差异(甚至与普通的np.array(alist)相比)。我们还可以使用arr.view(np.matrix) - hpaulj

1
你可以查看文档np.matrix的签名“data”可以是类似数组的或字符串的,而[0,0]和其对应的numpy.ndarray都可以满足要求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接