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
.