Scipy插值返回一个“无量纲”的数组。

4

我明白interp1d期望一个值的数组进行插值,但是当传入一个浮点数时,其行为很奇怪,需要问一下具体发生了什么以及返回了什么。

import numpy as np
from scipy.interpolate import interp1d

x = np.array([1,2,3,4])
y = np.array([5,7,9,15])
f = interp1d(x,y, kind='cubic')
a = f(2.5)

print(repr(a))
print("type is {}".format(type(a)))
print("shape is {}".format(a.shape))
print("ndim is {}".format(a.ndim))
print(a)

输出:

array(7.749999999999992)
type is <class 'numpy.ndarray'>
shape is ()
ndim is 0
7.749999999999992

编辑:为了澄清,我甚至不希望numpy有一个无维度、无形状的数组,更不用说scipy函数会返回这样一个数组了。
print("Numpy version is {}".format(np.__version__))
print("Scipy version is {}".format(scipy.__version__))

Numpy version is 1.10.4
Scipy version is 0.17.0

1
我可以复制这个。你能具体说明一下你的问题是什么吗?我猜你期望它应该返回一个float,并且你想知道这是否是一个错误。 - Fabian Rost
1
这个相关的问题可能有助于澄清事情:https://dev59.com/lXRA5IYBdhLWcg3w8ikl - Ryan J. Smith
考虑到f(2) = 7和f(3) = 9,我并不觉得2.5的插值在7和9之间很奇怪。 - Forzaa
@Forzaa- 问题不在于插值后的值,而是返回的无尺寸、无形状的数组。我同意这个值本身是正确的。 - michael_j_ward
@RyanJ.Smith,这完美地解决了问题。谢谢。 - michael_j_ward
1个回答

8

interp1d 返回一个与输入形状匹配的值 - 如果需要,会在 np.array() 中包装:

In [324]: f([1,2,3])
Out[324]: array([ 5.,  7.,  9.])

In [325]: f([2.5])
Out[325]: array([ 7.75])

In [326]: f(2.5)
Out[326]: array(7.75)

In [327]: f(np.array(2.5))
Out[327]: array(7.75)

许多 numpy 操作返回的是标量而不是0维数组。
In [330]: np.arange(3).sum()
Out[330]: 3

虽然实际上它返回的是一个numpy对象。
In [341]: type(np.arange(3).sum())
Out[341]: numpy.int32

它有一个形状()和ndim 0

interp1d返回一个数组。

In [344]: type(f(2.5))
Out[344]: numpy.ndarray

您可以使用 [()] 索引提取值。

In [345]: f(2.5)[()]
Out[345]: 7.75

In [346]: type(f(2.5)[()])
Out[346]: numpy.float64

这可能只是scipy代码中的疏忽。人们有多频繁地想要在一个点上进行插值?在一组规则的点上进行插值不是更常见吗?
================== f.__call__的文档非常明确地指出返回一个数组。
Evaluate the interpolant

Parameters
----------
x : array_like
    Points to evaluate the interpolant at.

Returns
-------
y : array_like
    Interpolated values. Shape is determined by replacing
    the interpolation axis in the original array with the shape of x.

===============

关于为什么numpy会有0维数组的问题,回答链接已经足够解释。但通常这个问题是被那些习惯了MATLAB的人问出来的。在MATLAB中,几乎所有东西都是2维的。它没有(真正的)标量。现在MATLAB有结构体和单元格,以及超过2维的矩阵。但我还记得(在1990年代),当时它没有这些功能。一切都是2维矩阵。

np.matrix近似于MATLAB情况,将其数组固定为2维。但它确实有一个_collapse方法,可以返回“标量”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接