我有一个包含大量元素的数据集,其中每个数据元素都有一个时间,一些元数据和一个值。集合中有许多单独的数据类型。所有信息都经过数字编码并存储为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);
输出ia
是a
的索引,不对应于b
中的值。使用ia
制作逻辑掩码,然后我可以将数据快速分配给所需行-列输出数组格式的正确行。
在python中,numpy.union1d(b,a)
给出输出C
,但不给出索引;这就是我要在这里找到的。
答案 0 :(得分:0)
由于您假设以下内容:
a
和b
均已排序b
是a
您可以使用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集合函数(通过提交的答案找到)发现了这一点。我只是不知道在哪里看,谢谢!