为什么对0d Numpy数组进行操作会给给予一个Numpy浮点数?

0wi1tuuw  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(80)

假设我有一个0d Numpy数组:

x = numpy.asarray(1.)

字符串
它的类型为numpy.ndarray。但现在在x上操作:

y = 1.*x


现在它的类型为numpy.float64。使用所有Numpy函数时也是如此。例如,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保持一致,我希望这个函数在传递浮点数时返回numpy.float64。但就目前而言,它返回0d数组。我可以返回1.*x.squeeze(),但这似乎非常丑陋。这个问题有规范的解决方案吗?

fcipmucu

fcipmucu1#

一个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)

字符串
正如numpy scalars页面所指出的,这样的标量和0d数组之间有很多重叠。
它们都可以被索引

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”方法来做这种“清理”。关于子类数组的文档谈到了这种终结。
有几种方法可以使这样的数组至少是一维的。

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测试。

相关问题