提问人:argentum_109 提问时间:10/25/2023 最后编辑:XMehdi01argentum_109 更新时间:10/26/2023 访问量:108
为什么对 0d Numpy 数组进行操作会产生 Numpy 浮点数?
Why does operating on a 0d Numpy array give a Numpy float?
问:
假设我有一个 0d Numpy 数组:
x = numpy.asarray(1.)
这有类型。但现在操作:numpy.ndarray
x
y = 1.*x
它现在具有类型 .使用所有 Numpy 函数时也是如此。例如,has 类型 。numpy.float64
numpy.sin(x)
numpy.float64
为什么?!
现在假设我有一个函数,在操作过程中,该函数必须提升数组的维度(执行一些检查或其他):
def fun(x):
x = np.asarray(x)
if x.ndim == 0:
x = x[None]
# Perform some checks and operate on x
return x.squeeze()
为了与 Numpy 保持一致,我希望这个函数在传递给它时返回一个浮点数。但就目前而言,它返回一个 0d 数组。我可以回去,但这似乎很丑陋。这个问题有规范的解决方案吗?numpy.float64
1.*x.squeeze()
答:
1赞
hpaulj
10/25/2023
#1
一个 python 标量、一个 0d 数组和一个 numpy 标量:
In [134]: x=1.23; y = np.array(x); z = 1.*y
In [135]: x,y,z
Out[135]: (1.23, array(1.23), 1.23)
In [136]: type(x),type(y),type(z)
Out[136]: (float, numpy.ndarray, numpy.float64)
正如页面所指出的,这样的标量和 0d 数组之间有很多重叠。numpy scalars
它们都可以被索引
In [137]: y[()], z[()]
Out[137]: (1.23, 1.23)
In [139]: y[()]=2.3;y
Out[139]: array(2.3)
主要区别在于标量无法更改:
In [140]: z[()]=2.34
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[140], line 1
----> 1 z[()]=2.34
TypeError: 'numpy.float64' object does not support item assignment
为什么许多操作返回标量而不是 0d 数组?我的猜测是,有一种“finalize”方法可以进行这种“清理”。关于子类化数组的文档谈到了这种终结。
有几种方法可以使这样的数组至少是 1d。
In [141]: y[None], np.atleast_1d(x), np.array(x, ndmin=1)
Out[141]: (array([2.3]), array([1.23]), array([1.23]))
np.squeeze
明确指出它将返回一个 0d 数组,而不是一个 numpy 标量。我不知道有任何其他操作可以做出这样的区分。
文档可能在这方面有所启发:np.inscalar
In [143]: np.isscalar(y), np.isscalar(z)
Out[143]: (False, True)
In [144]: y.ndim, z.ndim
Out[144]: (0, 0)
isscalar
是 Python 代码,具有多个测试。isinstance
评论
x
x = x[None]
x.squeeze()
numpy.float64
1.*x.squeeze()