访问数组某些部分的 Pythonic 方式

标签 python arrays numpy

我有一个二维 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()。

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

谢谢!

最佳答案

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

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

使用 boolean arrays索引数组可能更“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)]

注意:xy View ,所以修改xy 修改 data,并且没有复制,因此它不会减慢您的代码速度。但是范围副本,因为fancy indexing制作副本,因此修改它们不会影响 xydata

关于访问数组某些部分的 Pythonic 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16420673/

相关文章:

c - 使用结构数组在 C 中进行选择排序,错误 : "lvalue required..."

javascript - 使用过滤器根据类别显示项目

python - numpy svd : is there a way to find only the first singular vectors instead of doing full svd?

python - 仅在 R block 的情况下继承先前 block 中设置的变量(R markdown)

python - Keras model.summary() 对象到字符串

python - Python中通过变量调用函数

python - 用于识别 python 中图像上具有相似模式的特定元素/形状的数据结构

ruby - 导轨 : Remove substring from the string if in array

python - 创建具有相同自相关的排列

python - bool 索引与 np.where