有没有更好的方法为 numpy 数组标量分配新值?

2024-01-10

我正在对 numpy 数组中的标量值进行一些快速计算。正如它在文档 https://docs.scipy.org/doc/numpy-1.13.0/user/basics.types.html#array-scalars,

使用数组标量的主要优点是它们保留了 数组类型(Python 可能没有可用的匹配标量类型,例如 整数16)...

但是,是否有比这更好(更快、更简洁)的方法为现有数组标量分配新值:

>>> x = np.array(2.0, dtype='float32')

它可以工作,但不太方便(我正在做其他算术,并希望始终保留类型)。

由于明显的原因,这不起作用:

>>> x = np.array(1.0, dtype='float32')
>>> print(x, type(x))
1.0 <class 'numpy.ndarray'>
>>> x = 2.0
>>> print(x, type(x))
2.0 <class 'float'>

这也不:

>>> x = np.array(1.0, dtype='float32')
>>> x[] = 2.0
  File "<ipython-input-319-7f36071ff81d>", line 2
    x[] = 2.0
      ^
SyntaxError: invalid syntax

也不是这个:

>>> x = np.array(1.0, dtype='float32')
>>> x[:] = 2.0
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-24-62cd4ca238ce> in <module>()
      1 x = np.array(1.0, dtype='float32')
----> 2 x[:] = 2.0

IndexError: too many indices for array

UPDATE:

根据下面的评论(谢谢),我现在意识到我实际上并没有使用数组标量。x是一个零维数组。

以下是创建数组标量的方法:

>>> a = np.array((1.0, 2.0, 3.0), dtype='float32')
>>> x = a[0]
>>> print(x, type(x))
1.0 <class 'numpy.float32'>

或者简单地:

>>> x = np.float32(1.0)
>>> print(x, type(x))
1.0 <class 'numpy.float32'>

0d 数组可以修改,但是array scalar cannot:

In [199]: x = np.array(1.0, 'float32')
In [200]: x
Out[200]: array(1., dtype=float32)
In [201]: x.shape
Out[201]: ()
In [202]: x[...] = 2
In [203]: x
Out[203]: array(2., dtype=float32)
In [204]: x[()] =3
In [205]: x
Out[205]: array(3., dtype=float32)

你必须变异x,不将新对象分配给变量。

也就是说,我不明白为什么有人想要或需要这样做。


这个 0d 数组与array scalar:

In [207]: y = np.float32(1)
In [208]: y[...] = 2
....
TypeError: 'numpy.float32' object does not support item assignment

使用索引从数组中提取元素会产生array scalar:

In [210]: type(x[()])
Out[210]: numpy.float32

float32 对象具有许多数组属性,甚至方法,但并不完全相同:

In [211]: x.shape
Out[211]: ()
In [212]: y.shape
Out[212]: ()

可以使用与其形状相同大小的元组对数组进行索引。arr[1,2]是相同的arr[(1,2)]。形状为x is (),所以只能用空元组来索引,x[()]。相似地arr[:,:]适用于二维数组,但不适用于一维数组。...意味着任意数量的切片,因此适用于x[...].

够了__getitem__已定义为np.generic类对象允许索引,例如[...] and [()]。但分配尚未定义。

查看类的类层次结构可能会很有用,例如np.ndarray, np.int_, np.float32, np.float, and np.int.

更完整的报价

从您的链接:https://docs.scipy.org/doc/numpy-1.13.0/user/basics.types.html#array-scalars https://docs.scipy.org/doc/numpy-1.13.0/user/basics.types.html#array-scalars

NumPy 通常将数组元素作为数组标量(具有关联数据类型的标量)返回。数组标量与 Python 标量不同,但在大多数情况下,它们可以互换使用(主要例外是早于 v2.x 的 Python 版本,其中整数数组标量不能充当列表和元组的索引)。有一些例外,例如当代码需要标量的非常特定的属性时,或者当它专门检查某个值是否是 Python 标量时。通常,通过使用相应的 Python 类型函数(例如 int、float、complex、str、unicode)将数组标量显式转换为 Python 标量,可以轻松解决问题。

使用数组标量的主要优点是它们保留数组类型(Python 可能没有可用的匹配标量类型,例如 int16)。因此,使用数组标量可以确保数组和标量之间具有相同的行为,无论该值是否位于数组内部。 NumPy 标量也有许多与数组相同的方法。

第 2 段是根据第 1 段的上下文编写的。它试图解释为什么数组的元素是returned as array scalars。因此arr[0,1]返回一个np.float32对象,而不是 Pythonfloat.

这并不是建议我们创建一个array scalar直接地。

我首先写了这个答案,掩盖了 0d 数组之间的区别,以及这句话的意思array scalars.

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

有没有更好的方法为 numpy 数组标量分配新值? 的相关文章

随机推荐

  • BlackBerry - 在位图字段上调用单击事件

    谁能帮我解决以下问题 我正在为黑莓制作一个应用程序 从一个位图字段我必须通过单击该位图字段来调用一个新屏幕 我想要相同的代码 如何通过单击位图字段来调用新屏幕 我正在使用黑莓 JDE 4 7 尝试使 BitmapField 可聚焦 Bitm
  • Excel 中具有多个条件的 CUBESET() 函数

    我正在尝试在 Excel 中创建 CUBESET 函数 但我不知道如何使用多个条件过滤它同一维度内 这就是我迄今为止所遵循的一个标准 示例1 CUBESET ThisWorkbookDataModel Facebook Bucket C A
  • 有效地找到大型数组中的最低有效设置位?

    我有一个巨大的内存块 位向量 其大小N一个内存页内的位 考虑N平均为 5000 即 5k 位来存储一些标志信息 在某个时间点 超频繁 关键 我需要找到整个大位向量中的第一个位集 现在我对每个 64 个单词执行此操作 即在 builtin c
  • 如何自定义实现asp.net身份的UpdateAsync方法?

    我正在执行自定义 asp net 身份 而不是使用 asp net 内置表 我已成功创建用户并实现自定义CreateAsync 现在我想用新的加密密码更新用户 所以我不知道如何提供自定义实现UpdateAsync method 这是我的桌子
  • 使用 Guice 和 JDBC 进行事务 - 解决方案讨论

    在我的应用程序中 我需要将纯 JDBC 与 Guice 一起使用 但是 Guice 不提供任何内置支持来管理事务 guice persist只提供基于JPA的支持 我无法使用 所以我尝试实现一个简单的解决方案来使用 Guice 和 JDBC
  • 如何在两个 Visual C++ 项目之间共享相同的产品版本?

    我有 2 个 Visual C 项目 它们都有一个 RC 文件 其中定义了现场产品版本 我如何才能使这两个项目从全球范围内获取此版本 全局RC文件或者有什么解决办法 对我来说最有效的是添加两个 解决方案项目 一个是 h 文件 defines
  • 在内核空间模拟鼠标点击

    我试图在内核空间中模拟键盘和鼠标点击 因此它们将无法在其他应用程序中被阻止 与用户空间模拟相反 为了实现这个目标 我发现this https github com jasonpang Interceptor库是 C 的包装器this htt
  • Mongoose 将 req 对象传递给中间件

    我正在为猫鼬编写一个中间件 它使用 pre 为每个查找对象执行query hook postSchema pre query function query next I want to access the req user object
  • Spring Boot - 加载初始数据

    我想知道在应用程序启动之前加载初始数据库数据的最佳方法是什么 我正在寻找的是能够用数据填充我的 H2 数据库的东西 例如 我有一个域模型 用户 我可以通过转到 users 来访问用户 但最初数据库中不会有任何用户 因此我必须创建它们 有没有
  • 在 Android 上处理 React Native、Navigator 中的后退按钮

    我有一个Navigator在 Android 反应本机应用程序中 我在用着navigator push 导航到不同的页面 后退按钮会弹出导航器并返回一页似乎很自然 但事实并非如此 它会退出应用程序 做反应原生Navigator确实没有后退按
  • 使用 xslt 获取 X 位置处的节点值

    如何在不使用 foreach 的情况下使用 xslt X 位置的节点值
  • 获取Golang正则表达式中括号内的所有子字符串

    我想使用正则表达式获取 go 中所有括号内的所有子字符串 作为字符串 foo bar foo baz golang 的示例 我想要 bar 和 baz 在Python中我可以做re findall lt foo bar foo baz go
  • 卡尔曼滤波器总是在第一时间预测 0,0

    以下代码用于从下到上扫描图像 然而 卡尔曼滤波器的预测在第一次时总是显示0 0 这样 它就会从底部到 0 0 绘制一条线 如何使路径 卡尔曼滤波器 更接近实际路径 以下代码和图像已更新 import cv2 import matplotli
  • 布局API版本命名

    我不知道这是如何工作的 如果我创建了一个名为layout v11这适用于 v11 以上的所有 api 版本还是仅适用于 v11 第二个我可以将文件夹命名为layout v11 v14仅对 v11 和 v14 API 使用此布局 后缀指定资源
  • 从 xamarin 将文件上传到 Web api 服务器 - 请求处理时间太长

    我正在使用 HttpClient 将二进制文件发布到 Azure 托管的服务器 对于大小不太大的文件 该请求需要很长时间才能传递 有时 当客户端因超时而取消任务时 服务器会收到请求 我使用以下代码异步上传数据 public async Ta
  • Spirit X3可以与BOOST_FUSION_ADAPT_ADT一起使用吗?

    将我的代码从 QI 更改为 X3 并出现一些编译错误BOOST FUSION ADAPT ADT 我尝试了boost 1 64和1 67 它们都不起作用 我修改了精灵X3的例子rexpr min 添加 getter 和 setterstru
  • blogpost 的 rss feed 分页 url 是什么样的?

    我知道要访问 blogspot 博客的 rss feed 您需要访问 blog blogspot com feeds posts default 但是如何获取提要的第二页呢 我知道其他博客使用查询参数 paged 2 是否有类似的查询参数可
  • 如果资源已经存在,如何告诉 helm 不要创建/更改资源?

    我有一个秘密资源模板 安装后将为数据生成随机值 删除该图表 它没有删除秘密资源 因为它们保留下来 并稍后重新安装后 我遇到了问题 这导致它使用新生成的数据运行以前的秘密 这在我的情况下是不希望的 我试图找到我需要包含在模板中的 if 条件是
  • ASP.NET5 MVC6 的模型绑定问题

    我尝试将一些 JSON 数据以角度形式发布到我的 ASP NET5 MVC6 控制器操作 模型绑定器似乎不起作用 不知道我在这里缺少什么 我的 ASP 控制器 public class DefaultController Controlle
  • 有没有更好的方法为 numpy 数组标量分配新值?

    我正在对 numpy 数组中的标量值进行一些快速计算 正如它在文档 https docs scipy org doc numpy 1 13 0 user basics types html array scalars 使用数组标量的主要优点