numpy 数组和矩阵有什么区别?我应该使用哪一个?

2024-02-09

各自的优点和缺点是什么?

据我所知,如果需要的话,其中一个可以替代另一个,所以我应该同时使用两者还是应该只使用其中之一?

项目的风格会影响我的选择吗?我正在使用 numpy 进行一些机器学习,因此确实有很多矩阵,但也有很多向量(数组)。


Numpy matrices是严格二维的,而 numpyarrays(ndarrays) 是 N 维。 Matrix 对象是 ndarray 的子类,因此它们继承了所有 ndarrays 的属性和方法。

numpy 矩阵的主要优点是它们提供了方便的表示法 对于矩阵乘法:如果 a 和 b 是矩阵,则a*b是他们的矩阵 产品。

import numpy as np

a = np.mat('4 3; 2 1')
b = np.mat('1 2; 3 4')
print(a)
# [[4 3]
#  [2 1]]
print(b)
# [[1 2]
#  [3 4]]
print(a*b)
# [[13 20]
#  [ 5  8]]

另一方面,从 Python 3.5 开始,NumPy 支持使用中缀矩阵乘法@运算符,因此您可以在 Python >= 3.5 中实现与 ndarrays 矩阵乘法相同的便利性。

import numpy as np

a = np.array([[4, 3], [2, 1]])
b = np.array([[1, 2], [3, 4]])
print(a@b)
# [[13 20]
#  [ 5  8]]

矩阵对象和 ndarray 都有.T返回转置,但是矩阵 物体也有.H对于共轭转置,以及.I为逆。

相比之下,numpy 数组始终遵循以下规则:操作是 按元素应用(新的除外)@操作员)。因此,如果a and b是 numpy 数组,那么a*b是数组 通过将各分量按元素相乘而形成:

c = np.array([[4, 3], [2, 1]])
d = np.array([[1, 2], [3, 4]])
print(c*d)
# [[4 6]
#  [6 4]]

要获得矩阵乘法的结果,您可以使用np.dot (or @在 Python >= 3.5 中,如上所示):

print(np.dot(c,d))
# [[13 20]
#  [ 5  8]]

The **运算符的行为也不同:

print(a**2)
# [[22 15]
#  [10  7]]
print(c**2)
# [[16  9]
#  [ 4  1]]

Since a是一个矩阵,a**2返回矩阵乘积a*a. Since c是一个ndarray,c**2返回一个 ndarray,其中每个分量均平方 元素方面。

矩阵对象和 ndarray 之间还存在其他技术差异 (与np.ravel,项目选择和序列行为)。

numpy 数组的主要优点是它们比 二维矩阵。当你想要一个 3 维数组时会发生什么?然后 您必须使用 ndarray,而不是矩阵对象。因此,学习使用矩阵 对象是更多的工作——你必须学习矩阵对象运算,并且 ndarray 操作。

编写混合矩阵和数组的程序会让你的生活变得困难 因为你必须跟踪你的变量是什么类型的对象,以免 乘法会返回你意想不到的结果。

相反,如果你只使用 ndarrays,那么你可以做任何事情 矩阵对象可以做更多的事情,除了略有不同 函数/符号。

如果你愿意放弃 NumPy 矩阵产品的视觉吸引力 表示法(在 Python >= 3.5 中使用 ndarray 几乎可以优雅地实现),那么我认为 NumPy 数组绝对是正确的选择。

附言。当然,你真的不必以牺牲另一个为代价来选择一个, 自从np.asmatrix and np.asarray允许您将一种转换为另一种(如 只要数组是二维的)。


有一个 NumPy 之间差异的概要arrays与 NumPymatrixes here https://www.numpy.org/devdocs/user/numpy-for-matlab-users.html#array-or-matrix-which-should-i-use.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

numpy 数组和矩阵有什么区别?我应该使用哪一个? 的相关文章

  • 将数据帧行转换为字典

    我有像下面的示例数据这样的数据帧 我正在尝试将数据帧中的一行转换为类似于下面所需输出的字典 但是当我使用 to dict 时 我得到了索引和列值 有谁知道如何将行转换为像所需输出那样的字典 任何提示都非常感激 Sample data pri
  • Pandas 中允许重复列

    我将一个大的 CSV 包含股票财务数据 文件分割成更小的块 CSV 文件的格式不同 像 Excel 数据透视表之类的东西 第一列的前几行包含一些标题 公司名称 ID 等在以下列中重复 因为一家公司有多个属性 而不是一家公司只有一栏 在前几行
  • 填充两个函数之间的区域

    import matplotlib pyplot as plt import numpy as np def domain x np arange 0 10 0 001 f1 lambda x 2 x x 2 0 5 plt plot x
  • 切片 Dataframe 时出现 KeyError

    我的代码如下所示 d pd read csv Collector Output csv df pd DataFrame data d dfa df copy dfa dfa rename columns OBJECTID Object ID
  • python suds SOAP 请求中的名称空间前缀错误

    我使用 python suds 来实现客户端 并且在发送的 SOAP 标头中得到了错误的命名空间前缀 用于定义由element ref 在 wsdl 中 wsdl 正在引用数据类型 xsd 文件 请参见下文 问题出在函数上GetRecord
  • 对图像块进行多重处理

    我有一个函数必须循环遍历图像的各个像素并计算一些几何形状 此函数需要很长时间才能运行 在 24 兆像素图像上大约需要 5 小时 但似乎应该很容易在多个内核上并行运行 然而 我一生都找不到一个有据可查 解释充分的例子来使用 Multiproc
  • Python urllib.request.urlopen:AttributeError:'bytes'对象没有属性'data'

    我正在使用 Python 3 并尝试连接到dstk 我收到错误urllib包裹 我对SO进行了很多研究 但找不到与这个问题类似的东西 api url self api base street2coordinates api body jso
  • 从 python 发起 SSH 隧道时出现问题

    目标是在卫星服务器和集中式注册数据库之间建立 n 个 ssh 隧道 我已经在我的服务器之间设置了公钥身份验证 因此它们只需直接登录而无需密码提示 怎么办 我试过帕拉米科 它看起来不错 但仅仅建立一个基本的隧道就变得相当复杂 尽管代码示例将受
  • 在 angular2 中过滤数组

    我正在研究如何在 Angular2 中过滤数据数组 我研究过使用自定义管道 但我觉得这不是我想要的 因为它似乎更适合简单的表示转换 而不是过滤大量数据 数组排列如下 getLogs Array
  • 如何使用列表作为pandas数据框中的值?

    我有一个数据框 需要列的子集包含具有多个值的条目 下面是一个带有 运行时 列的数据框 其中包含程序在各种条件下的运行时 df condition a runtimes 1 1 5 2 condition b runtimes 0 5 0 7
  • 无法在 osx-arm64 上安装 Python 3.7

    我正在尝试使用 Conda 创建一个带有 Python 3 7 的新环境 例如 conda create n qnn python 3 7 我收到以下错误 Collecting package metadata current repoda
  • 将数组排序为第一个最小值、第一个最大值、第二个最小值、第二个最大值等

    编写一个JS程序 返回一个数组 其中第一个元素是第一个最小值 第二个元素是第一个最大值 依此类推 该程序包含一个函数 该函数接受一个参数 一个数组 该函数根据要求返回数组 输入示例 array 2 4 7 1 3 8 9 预期输出 1 9
  • Ubuntu 上的 Python 2.7

    我是 Python 新手 正在 Linux 机器 Ubuntu 10 10 上工作 它正在运行 python 2 6 但我想运行 2 7 因为它有我想使用的功能 有人敦促我不要安装 2 7 并将其设置为我的默认 python 我的问题是 如
  • Elastic Beanstalk 中的 enum34 问题

    我正在尝试在 Elastic Beanstalk 中设置 django 环境 当我尝试通过requirements txt 文件安装时 我遇到了python3 6 问题 File opt python run venv bin pip li
  • 结构体指针的动态数组

    我必须使用以下代码块来完成学校作业 严格不进行任何修改 typedef struct char firstName char lastName int id float mark pStudentRecord pStudentRecord
  • 从 Twitter API 2.0 获取 user.fields 时出现问题

    我想从 Twitter API 2 0 端点加载推文 并尝试获取标准字段 作者 文本 和一些扩展字段 尤其是 用户 字段 端点和参数的定义工作没有错误 在生成的 json 中 我只找到标准字段 但没有找到所需的 user fields 用户
  • 在 Javascript 中减少/分组数组

    基于this https stackoverflow com a 40774906 3254598例如 我想以稍微不同的方式按对象进行分组 结果应该如下 key audi items make audi model r8 year 2012
  • 列表值的意外更改

    这是我的课 class variable object def init self name name alias parents values table name of the variable self name 这是有问题的函数 f
  • 您可以使用关键字参数而不提供默认值吗?

    我习惯于在 Python 中使用这样的函数 方法定义 def my function arg1 None arg2 default do stuff here 如果我不供应arg1 or arg2 那么默认值None or default
  • 使用泛型全面实现特征

    我正在通过实现矩阵数学来练习 Rust 但遇到了一些障碍 我定义了我认为与矩阵相关的特征 trait Matrix

随机推荐