Python:使用setdiff分配给numpy数组

时间:2018-03-19 23:31:09

标签: python numpy

我有一个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数组:

  • 对于0到2的元素,我想要值1(1的数量是sum_vals[0],我希望它位于range(wherediff[0], wherediff[1])
  • 的位置
  • 对于元素3到5(包括3和5),我想要值2(2的数量是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

有什么想法吗?

2 个答案:

答案 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 ...