【发布时间】:2018-09-09 21:29:54
【问题描述】:
我正在对 numpy 数组中的标量值进行一些快速计算。正如documentation 中所说,
使用数组标量的主要优点是它们保留了 数组类型(Python 可能没有可用的匹配标量类型,例如 int16)...
但是有没有比这更好(更快,更简洁)的方法来为现有数组标量分配新值:
>>> 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
更新:
基于下面的 cmets(谢谢),我现在意识到我实际上并没有使用数组标量。 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'>
【问题讨论】:
-
另外,即使它们是可变的——
x = 2.0只是重新绑定名称x以指向不同的对象。它唯一改变的是全局命名空间。 (如果您是从另一种语言(尤其是 C++)转向 Python,这可能是您的困惑。x不是 C++ 意义上的变量,即具有类型和值的内存位置,它只是命名空间绑定中的名称到一个对象,并且该对象具有内存位置、类型和值。) -
@abarnert NumPy 标量(例如
x)只是形状为()的数组。正如 hpaulj 的回答所示,它们是可变的。 -
谢谢@abarnet。我将更正问题中的代码以将
x = np.array((2.0), dtype='float32')更改为x = np.array(2.0, dtype='float32')。我认为这个问题仍然有效。 -
@jmd_dk:
x不是数组标量。numpy.float32(1.0)将是一个数组标量。x是一个 0 维数组。 -
@Bill 如果您重新表述问题,请显示 both
np.float32(1.0)和np.array(1.0, dtype=np.float32),并展示您如何尝试所有不同的方法(也可以尝试x[:] = 2.0,这会给你一个信息性错误),然后答案会比现在更适合你的问题。
标签: python arrays numpy scalar copy-assignment