访问数组某些部分的python方法
我有一个2D numpy数组,其中包含绘图的x(数据[:,0])和y(数据[:,1])信息 我希望将曲线拟合到数据,但仅使用数据的某些部分来确定拟合参数(例如,使用范围x=x1->x2和x3->x4中的数据)。我的计划是创建一个新的numpy数组,其中只包含我打算传递给SciPy曲线拟合例程的数据访问数组某些部分的python方法,python,arrays,numpy,Python,Arrays,Numpy,我有一个2D numpy数组,其中包含绘图的x(数据[:,0])和y(数据[:,1])信息 我希望将曲线拟合到数据,但仅使用数据的某些部分来确定拟合参数(例如,使用范围x=x1->x2和x3->x4中的数据)。我的计划是创建一个新的numpy数组,其中只包含我打算传递给SciPy曲线拟合例程的数据 index_range1 = np.where((data[:,0] > x1) and (data[:,0] < x2) index_range2 = np.where((data[:,
index_range1 = np.where((data[:,0] > x1) and (data[:,0] < x2)
index_range2 = np.where((data[:,0] > x3) and (data[:,0] < x4)
index_range1=np.其中((数据[:,0]>x1)和(数据[:,0]x3)和(数据[:,0]
然后我将使用这些索引范围将感兴趣的数据拉入一个新数组,我可以将它传递给CurveFit
首先,考虑到Python可以处理复杂数组,这似乎是一种非常不符合Python的方法。其次,在运行脚本时,我收到一个错误,指出我需要在表达式中使用.any()或.all()作为索引范围1和2
因此,我想知道,是否有人对一种改进的、更具python风格的方法来解决这个问题有任何建议
谢谢!要从另外两个数组中获得布尔数组,请使用
&
比较元素:
index_range1 = np.where((data[:,0] > x1) & (data[:,0] < x2))
index_range2 = np.where((data[:,0] > x3) & (data[:,0] < x4))
您可以通过以下方式缩短/使其更具可读性:
x, y = data.T
range1 = data[(x > x1) & (x < x2)]
range2 = data[(x > x3) & (x < x4)]
x,y=data.T
范围1=数据[(x>x1)和(xx3)和(x
注意:
x
和y
是视图,因此修改x
,y
会修改数据
,并且没有复制,因此不会降低代码速度。但是范围
是副本,因为创建了副本,所以修改它们不会影响x
,y
,或者数据
,以获得boolean数组在另外两个数组中,使用和比较元素:
index_range1 = np.where((data[:,0] > x1) & (data[:,0] < x2))
index_range2 = np.where((data[:,0] > x3) & (data[:,0] < x4))
您可以通过以下方式缩短/使其更具可读性:
x, y = data.T
range1 = data[(x > x1) & (x < x2)]
range2 = data[(x > x3) & (x < x4)]
x,y=data.T
范围1=数据[(x>x1)和(xx3)和(x
注意:x
和y
是视图,因此修改x
,y
会修改数据
,并且没有复制,因此不会减慢代码的速度。但是范围
是副本,因为创建了副本,因此修改它们不会影响此ca中的x
、y
、或数据
se,您要使用numpy.logical\u和:
>>> 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])
>>将numpy作为np导入
>>>数据=np.arange(100)
>>>data[np.logical_和(50)在本例中,您希望使用numpy.logical_和:
>>> 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])
>>将numpy作为np导入
>>>数据=np.arange(100)
>>>数据[np.logical_和(50谢谢,我没有意识到逻辑和函数。这非常有帮助。谢谢,我没有意识到逻辑和函数。这非常有帮助。谢谢,我把这个和下面的答案结合起来,用一行来解决我的问题:my_data=data[np.logical_或((数据[:,0]>x1)和(数据[:,0]x3)和(数据)你可以用管道,a | b
代替logical_或(a,b)
。my_data=data[(data[:,0]>x1)和(data[:,0]x3)和(data[:,0]
用很多括号!谢谢,那更好!我想我更喜欢“logical_”&
和|
运算符的函数。后者实际上执行逐位运算。结果表明,它们对布尔数组给出相同的结果,因为True
是1的子类,但我发现这不太清楚。谢谢,我将这一点和下面的答案结合起来,在一行中解决了我的问题:>my_data=data[np.logical_or((data[:,0]>x1)和(data[:,0]x3)和(data[:,0]
@Ian您可以使用管道,a|b
而不是logical_或(a,b)
。例如,my_data=data[((data[:,0]>x1)和(data[:,0]
使用大量的括号!谢谢,这样更好!FWIW,我想我更喜欢“logical_XXX”&
和|
运算符的函数。后者实际上执行位运算。结果表明,它们对布尔数组给出相同的结果,因为True
是1的子类,但我发现这一点不太清楚。