1

我有一个二维 numpy 数组,其中包含一个绘图的 x (data[:,0]) 和 y(data[:,1]) 信息。

我想为数据拟合曲线,但仅使用数据的某些部分来确定拟合参数(例如,使用 x = x1 -> x2 和 x3 -> x4 范围内的数据)。我的计划是创建一个新的 numpy 数组,其中仅包含我打算传递给 SciPy CurveFitting 例程的数据。

index_range1 = np.where((data[:,0] > x1) and (data[:,0] < x2)
index_range2 = np.where((data[:,0] > x3) and (data[:,0] < x4)

然后我会使用这些索引范围将感兴趣的数据拉入一个新数组,我可以将它传递给 CurveFit。

首先,鉴于 Python 可以处理复杂的数组,这似乎是一种非常不符合 Python 的方法。其次,在运行我的脚本时,我收到一条错误消息,提示我需要在 index_range 1 和 2 的表达式中使用 .any() 或 .all()。

因此,我想知道是否有人对解决此问题的改进、更 Python 的方法有任何建议。

谢谢!

4

2 回答 2

2

要从其他两个中获取一个布尔数组,请使用&按元素进行比较:

index_range1 = np.where((data[:,0] > x1) & (data[:,0] < x2))
index_range2 = np.where((data[:,0] > x3) & (data[:,0] < x4))

使用布尔数组来索引数组可能更“pythonic”。您不需要查找(使用where)并保存索引,您可以直接从数组中访问数据:

range1 = data[(data[:,0] > x1) & (data[:,0] < x2)]
range2 = data[(data[:,0] > x3) & (data[:,0] < x4)]

您可以通过以下方式缩短它/使其更具可读性:

x, y = data.T
range1 = data[(x > x1) & (x < x2)]
range2 = data[(x > x3) & (x < x4)]

注意:xandyviews,所以正在 modifying xymodifying ,data并且没有复制,所以它不应该减慢你的代码速度。但是ranges 是副本,因为花哨的索引会产生副本,所以修改它们不会影响x,ydata.

于 2013-05-07T13:48:37.780 回答
2

在这种情况下,您要使用numpy.logical_and

>>> import numpy as np
>>> data = np.arange(100)
>>> data[np.logical_and(50 <= data,data <= 70)]
array([50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
       67, 68, 69, 70])

原因是对于常规的and,python 会查看左边的数组并说“这是真的吗?”。但是,数组没有“类真”的概念(它们拒绝猜测“真”数组的外观),因此它们会引发您看到的异常(暗示您可能打算使用allorany方法)。

于 2013-05-07T13:49:19.907 回答