在python中复制MATLAB联合的索引输出

时间:2019-09-13 12:18:04

标签: python matlab numpy

我有一个包含大量元素的数据集,其中每个数据元素都有一个时间,一些元数据和一个值。集合中有许多单独的数据类型。所有信息都经过数字编码并存储为numpy数组。我需要将此1xn数据流排序到一个数组中,其中每一行都是唯一的时间,而各列表示当时的不同数据。我已经使用MATLAB的并集函数在MATLAB中解决了这个问题(不同的方式,但是又有故事了)。我想在python中复制它,但是为了完成该任务,我被困了几天。

我已经将唯一的排序时间值提取到一个1xm的数组中(在下面的示例中为a)。我还提取了一种数据类型的每个元素,该数据类型也是唯一的并已排序(在下面的示例中为b)。 b始终是a的子集。以下MATLAB代码显示了其工作原理。

a = [1,2,3,4,5,6,7,8,9,10]
b = [1,4,7,10]
[C,ib,ia] = union(b,a)
C =1
     1     2     3     4     5     6     7     8     9    10
ib =
     1
     2
     3
     4
ia =
     2
     3
     5
     6
     8
     9
mask = ones(size(a))
mask(ia)=0
data_column(mask == 1) = data_vector(ib);  

输出iaa的索引,不对应于b中的值。使用ia制作逻辑掩码,然后我可以将数据快速分配给所需行-列输出数组格式的正确行。

在python中,numpy.union1d(b,a)给出输出C,但不给出索引;这就是我要在这里找到的。

3 个答案:

答案 0 :(得分:0)

由于您假设以下内容:

  • ab均已排序
  • ba
  • 的子集
  • numpy库在环境中可用
  • 不需要索引,只需要值

您可以使用numpy.setdiff1d吗?

>>> import numpy
>>> a = [1,2,3,4,5,6,7,8,9,10]
>>> b = [1,4,7,10]
>>> numpy.union1d(a,b)
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
>>> numpy.setdiff1d(a,b)
array([2, 3, 5, 6, 8, 9])

答案 1 :(得分:0)

您可以使用union和一些排序来定义自己的unique函数。

import numpy as np

def union(a, b):
    ua = np.unique(a)                           # get unique values in input a
    ub = np.unique(b)                           # get unique values in input b
    c = np.concatenate((a, b))                  # combine a and b
    C, ic = np.unique(c, return_index=True)     # call unqiue and return incides

    sel = ic > (a.size - 1)         # every index larger than a.size comes from b
    ia = ic[~sel]
    ib = ic[sel] - a.size

    return C, ia, ib

以及您的测试:

>>> a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
>>> b = np.array([1, 4, 7, 10])
>>> [C, ib, ia] = union(b, a)
>>> C
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
>>> ib
array([0, 1, 2, 3], dtype=int64)
>>> ia
array([1, 2, 4, 5, 7, 8], dtype=int64)

当然,由于Matlab从1开始建立索引,而Python从0开始建立索引,因此索引会减少1。

答案 2 :(得分:0)

由于这里提出了建议,我找到了一个相当简洁的答案。使用numpy.intersect1d()函数,我可以返回我要寻找的索引。如下所示:其中m是列索引,data_column最初是nan长度的全部a,而data_vector是b的长度

a = [1,2,3,4,5,6,7,8,9,10]
b = [1,4,7,10]
[C,ia,ib] = numpy.intersect1d(a,b,assume_unique=True,return_indices=True)

print(C)
[ 1  4  7 10]

print(ia)
[0 3 6 9]

print(ib)
[0 1 2 3]

data_column[ia,m] = data_vector

return indices功能是关键。我通过阅读有关numpy集合函数(通过提交的答案找到)发现了这一点。我只是不知道在哪里看,谢谢!