对于任何类型的编程,我都是新手。
我有一组x和y值。
x = [1.3, 2.1, 3.5, 4.0, 3.9, 3.1, 2.7, 1.5, 1.7, 2.0, 3.6, 4.2]
y = [1.0, 1.4, 2.0, 2.2, 2.7, 3.1, 3.3, 3.9, 4.3, 4.4, 5.0, 5.5]
我想在每次x的渐变改变符号时将它们分开。我的第一个想法就是这个
import numpy as np
x_grad = np.gradient(x)
array = np.column_stack((x, y, x_grad))
pos = (x_grad >= 0)
neg = (x_grad < 0)
x_y_pos = np.column_stack((x, y, pos))
x_y_neg = np.column_stack((x, y, neg))
x_y_pos_new = x_y_pos[x_y_pos.all(1)]
x_y_neg_new = x_y_neg[x_y_neg.all(1)]
但这只给了我两个数组,一个是x有正梯度而另一个是负数。这不好,因为我需要将第一部分和最后部分分开。
我正试图想出某种循环,但我无法弄明白该怎么做,这是我无用的尝试
array_1=[]
for i in xrange(0, len(array)):
while True:
array[:,2][i] >= 0
array_1.append(array)
break
这给了我12次完整数组(即数组的长度)。当第三列不再是正面时,我希望它停止。即使它做了我想要的,我仍然只会收到第一部分。
只是旁注:我无法手动拆分。这只是我所拥有的许多大型数据文件中发生的事情的简化示例,因此梯度变化发生在不同的地方。我需要为数据做什么。
任何想法都会非常感激,我让自己疯了。
答案 0 :(得分:1)
如果我了解您的需求,您可以先使用How to detect a sign change for elements in a numpy array中的符号更改算法 构建一个符号更改位置数组:
import numpy as np
x = [1.3, 2.1, 3.5, 4.0, 3.9, 3.1, 2.7, 1.5, 1.7, 2.0, 3.6, 4.2]
y = [1.0, 1.4, 2.0, 2.2, 2.7, 3.1, 3.3, 3.9, 4.3, 4.4, 5.0, 5.5]
gradx = np.gradient(x)
asign = np.sign(gradx)
signchange = ((np.roll(asign, 1) - asign) != 0).astype(int)
然后,您可以从How do I get a list of indices of non zero elements in a list?
获取符号更改的元素位置splitloc = [i for i, e in enumerate(signchange) if e != 0]
然后你可以简单地拆分数组使用numpy.split
np.split(x,splitloc)
答案 1 :(得分:0)
好的,所以你只关心渐变的符号 - 因此,你的x
值根本不重要。
只计算正在运行的双元素差异
y_diffs = y[1:] - y[:-1]
找到连续元素符号发生变化的索引:
switch_idx = [] sign = y_diffs [0]&gt; 0 对于idx,枚举中的val(y_diffs [1:]): sign_new = y_diffs [idx + 1]&gt; 0 如果没有签名== sign_new: switch_idx.append(sign_new) sign_new = sign
然而,你所做的只是找到当地的极值。我严重怀疑你在做什么是科学上正确的 - 你的采样间隔(见x
值)是不均匀的,因此你应该首先使用数学模型插入你的函数最能描述您的价值观。在那,找到极值是有道理的。
答案 2 :(得分:0)
如果我理解正确,你想分割对应渐变为负/正的数组。
你使用列表理解
得到这个 negative_x_based_vals = ([x[p] for p in range(0,len(x_grad)) if x_grad[p] < 0]); # result will be [3.9, 3.1, 2.7, 1.5]
positive_x_based_vals = ([x[p] for p in range(0,len(x_grad)) if x_grad[p] >= 0]; # result will be [1.3, 2.1, 3.5, 4.0, 1.7, 2.0, 3.6, 4.2])
这就是你想要的吗? (顺便说一下,这并没有使用numpy)