Python:使用setdiff将值分配给numpy数组

2024-10-01 04:45:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个numpy阵列:

>>> n1 = np.array([1, 1, 2, 1, 4, 5, 3, 8, 2, 9, 9])

由此,我可以得到从开始到下一个较低数量开始之前的最高值的元素数量,如下所示:

^{pr2}$

我可以在数组的开头插入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数组:

  • 对于包含0到2的元素,我需要值1(1的数量是sum_vals[0],我希望它位于range(wherediff[0], wherediff[1])的位置)
  • 对于包含3到5的元素,我需要值2(2s的数量是sumvals[1],我希望它位于range(wherediff[1], wherediff[2])的位置
  • 对于包含6到7的元素,我需要值3
  • 对于最后一个元素,我需要值4

我试过了:

>>> 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

有什么想法吗?在


Tags: numpy元素数量s3nprange数组array
2条回答

跳过所有的setdiff1d和索引操作,使用布尔数组:

flags = n1[1:] < n1[:-1]
flags = np.insert(flags, 0, True)

result = np.cumsum(flags)

cumsum对每一个True加1,所以第一个元素加一次,每次{}的元素比前一个元素小一次。在

如果您使用的是本机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)

如果你想做任何事情都在纽比,那么这就是方法:

^{pr2}$

请注意,您可以在这里使用assume_unique=True。。。在

相关问题 更多 >