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

数据挖掘 线性回归 麻木的 矩阵
2021-10-16 03:25:07

我正在阅读这段代码,以从头开始实现线性回归:

# 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 的功能?如果我用后者替换前者,最终代码会正常运行吗?

谢谢。

编辑:这是问这个问题的正确地方吗?我刚来这地方...

2个回答

不,它们完全一样。

在这种情况下,除了处理时间可能微不足道之外,绝对没有区别这都是开源代码,所以我们可以阅读它:

对我们来说,numpy 的相关部分是matrix构造函数(是的,np.matrix是底层的 python 类)。在 NumPy 代码的总结中,我们看到:

class matrix(N.ndarray):
# ...
    def __new__(subtype, data, dtype=None, copy=True):
    # ...
        if isinstance(data, N.ndarray):
            if dtype is None:
                intype = data.dtype
            else:
                intype = N.dtype(dtype)
            new = data.view(subtype)
            if intype != data.dtype:
                return new.astype(intype)
            if copy: return new.copy()
            else: return new
        # ...
        arr = N.array(data, dtype=dtype, copy=copy)
        ndim = arr.ndim
        shape = arr.shape
        # some extra checks
        ret = N.ndarray.__new__(subtype, shape, arr.dtype,
                                buffer=arr,
                                order=order)
        return ret

我们作为data论据给予的就是我们给予的np.matrix()因此我们可以画出这两种情况:

np.matrix([0, 0])

  1. python解释器构建两个整数:0和0。
  2. python 解释器从指向两个整数的指针构建一个列表。
  3. python 解释器评估matrix构造函数,列表为data.
  4. 构造if函数中的 不执行,而是np.array从列表中构建。
  5. array构造函数内部检查数据类型。
  6. 返回最终数组(第二个array构造函数执行的工作少得多,因为它被传递了buffer=

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

  1. python解释器构建两个整数:0和0。
  2. python 解释器从指向两个整数的指针构建一个列表。
  3. python 解释器评估array构造函数。
  4. 结果array被传递datamatrix构造函数,并被if执行。
  5. 内的if数据类型取自现有数组。
  6. array复制并返回。

两种方式都执行几乎相同数量的构造函数和代码行。有人可能会争辩说,复制数组(copy=参数)可能是一项缓慢的操作。然而,考虑到要获得足够的数据array.copy()以使其变慢,首先需要构建一个该大小的完整 python 列表,copy()与列表构建相比,时间可以忽略不计。换句话说,这两种方法都需要构造列表——因为 python 总是会在传递参数之前对其进行评估——这是这段代码执行中最慢的部分。

至于返回值,它们是完全一样的上面总结(和链接)的构造函数中的大部分代码是为了确保在提供等效输入的情况下获得相同的返回。


PS(无关注释)如果开始从文件(或任何其他外部源)读取数据,则图片会更改。如果一个人直接读入一个array而不经过python列表阶段,那么该方法肯定会快得多。处理瓶颈是python列表,如果可以避免,事情会变得更快。

正如你肯定知道的类型np.一个rr一个是的([0,0])numpy.ndarray和类型[0,0]list

并且使用 numpy ndarrays 而不是列表要快得多此外,numpy 数组消耗的内存更小。因此,由于更高的速度和内存使用等(功能),最好使用 numpy 数组而不是列表。