我有一个numpy数组:
>>> n1 = np.array([1, 1, 2, 1, 4, 5, 3, 8, 2, 9, 9])
从这一点开始,我可以在下一个较低的数字开始之前,从开头到最高值得到元素的数量,如下所示:
>>> wherediff = np.where(n1[1:]-n1[:-1] < 0)
>>> wherediff = wherediff[0] + 1
>>> wherediff
array([3, 6, 8])
我可以在这个数组的开头插入一个0:
>>> wherediff = np.insert(wherediff, 0, 0)
>>> wherediff
array([0, 3, 6, 8])
我可以得到每个连续值之间的元素数量:
>>> sum_vals = np.abs(wherediff[1:] - wherediff[:-1])
>>> sum_vals
array([3, 3, 2])
现在,我想生成另一个具有以下属性的numpy数组:
sum_vals[0]
,我希望它位于range(wherediff[0], wherediff[1])
sumvals[1]
,我希望它位于range(wherediff[1], wherediff[2])
我试过了:
>>> n3 = []
>>> for i in range(1, wherediff.shape[0]):
... s1 = set(range(wherediff[i]))
... s2 = set(range(wherediff[i-1]))
... s3 = np.setdiff1d(s1, s2)[0]
... n3.append(np.repeat(i, len(s3)))
以为我稍后会切换到一个数组,但setdiff1d
函数没有按预期执行。它正在这样做:
>>> for i in range(1, wherediff.shape[0]):
... s1 = set(range(wherediff[i]))
... s2 = set(range(wherediff[i-1]))
... s3 = np.setdiff1d(s1, s2)[0]
... print(s3)
...
set([0, 1, 2])
set([0, 1, 2, 3, 4, 5])
set([0, 1, 2, 3, 4, 5, 6, 7])
而我想要;
0 1 2
3 4 5
6 7
8, 9, 10
有什么想法吗?
答案 0 :(得分:2)
跳过所有setdiff1d内容和索引操作,并使用一组布尔值:
flags = n1[1:] < n1[:-1]
flags = np.insert(flags, 0, True)
result = np.cumsum(flags)
cumsum
为每个True
的总和加1,所以一次为第一个元素,每次n1
的元素小于前一个元素。
答案 1 :(得分:0)
如果你使用的是原生的python集,你也可以在没有numpy的情况下进行diff操作:
wherediff = np.array([0, 3, 6, 8])
for i in range(1, wherediff.shape[0]):
s1 = set(range(wherediff[i]))
s2 = set(range(wherediff[i-1]))
s3 = np.array(list(s1 - s2))
print(s3)
如果你想在numpy中做所有事情,那就是这样:
for i in range(1, wherediff.shape[0]):
s1 = np.array(range(wherediff[i]))
s2 = np.array(range(wherediff[i-1]))
s3 = s3 = np.setdiff1d(s1, s2)
print(s3)
请注意,您可以在此使用assume_unique=True
...