不,它们完全一样。
在这种情况下,除了处理时间可能微不足道之外,绝对没有区别。这都是开源代码,所以我们可以阅读它:
对我们来说,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])
- python解释器构建两个整数:0和0。
- python 解释器从指向两个整数的指针构建一个列表。
- python 解释器评估
matrix
构造函数,列表为data
.
- 构造
if
函数中的 不执行,而是np.array
从列表中构建。
- 在
array
构造函数内部检查数据类型。
- 返回最终数组(第二个
array
构造函数执行的工作少得多,因为它被传递了buffer=
)
np.matrix(np.array([0, 0]))
- python解释器构建两个整数:0和0。
- python 解释器从指向两个整数的指针构建一个列表。
- python 解释器评估
array
构造函数。
- 结果
array
被传递data
给matrix
构造函数,并被if
执行。
- 内的
if
数据类型取自现有数组。
- 被
array
复制并返回。
两种方式都执行几乎相同数量的构造函数和代码行。有人可能会争辩说,复制数组(copy=
参数)可能是一项缓慢的操作。然而,考虑到要获得足够的数据array.copy()
以使其变慢,首先需要构建一个该大小的完整 python 列表,copy()
与列表构建相比,时间可以忽略不计。换句话说,这两种方法都需要构造列表——因为 python 总是会在传递参数之前对其进行评估——这是这段代码执行中最慢的部分。
至于返回值,它们是完全一样的。上面总结(和链接)的构造函数中的大部分代码是为了确保在提供等效输入的情况下获得相同的返回。
PS(无关注释)如果开始从文件(或任何其他外部源)读取数据,则图片会更改。如果一个人直接读入一个array
而不经过python列表阶段,那么该方法肯定会快得多。处理瓶颈是python列表,如果可以避免,事情会变得更快。