从MATLAB'复制索引输出;python中的s联合
我有一个包含大量元素的数据集,其中每个数据元素都有一个时间、一些元数据和一个值。集合中有许多独立的数据类型。所有信息都以数字编码并存储为numpy数组。我需要将这个1xn数据流排序到一个数组中,其中每一行都是唯一的时间,列表示当时的不同数据。我已经用MATLAB的union函数在MATLAB中解决了这个问题(不同的方法,但故事还有一段时间)。我想在python中复制这一点,但为了完成这一点,我已经被困了几天 我已将唯一的排序时间值提取到一个1xm数组中(从MATLAB'复制索引输出;python中的s联合,python,matlab,numpy,Python,Matlab,Numpy,我有一个包含大量元素的数据集,其中每个数据元素都有一个时间、一些元数据和一个值。集合中有许多独立的数据类型。所有信息都以数字编码并存储为numpy数组。我需要将这个1xn数据流排序到一个数组中,其中每一行都是唯一的时间,列表示当时的不同数据。我已经用MATLAB的union函数在MATLAB中解决了这个问题(不同的方法,但故事还有一段时间)。我想在python中复制这一点,但为了完成这一点,我已经被困了几天 我已将唯一的排序时间值提取到一个1xm数组中(a,在下面的示例中)。我还提取了一个数据类
a
,在下面的示例中)。我还提取了一个数据类型的每个元素,该数据类型也是唯一的和排序的(b
,在下面的示例中)b
始终是a
的子集。下面的MATLAB代码显示了它的工作原理
a=[1,2,3,4,5,6,7,8,9,10]
b=[1,4,7,10]
[C,ib,ia]=联合(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
遮罩=个(尺寸(a))
遮罩(ia)=0
数据列(掩码==1)=数据向量(ib);
输出ia
是a
的索引,与b
中的值不对应。使用ia
制作逻辑掩码,然后我可以快速将数据分配到所需行-列输出数组格式的正确行
在python
numpy中,union1d(b,a)
给出输出C
,但不给出索引;这就是我想在这里找到的。因为您假设:
和a
都已排序b
是b
a
- numpy库在环境中可用
- 不需要索引,只需要值
numpy.setdiff1d
导入numpy
>>>a=[1,2,3,4,5,6,7,8,9,10]
>>>b=[1,4,7,10]
>>>numpy.union1d(a,b)
数组([1,2,3,4,5,6,7,8,9,10])
>>>numpy.setdiff1d(a,b)
数组([2,3,5,6,8,9])
因为您假定:
和a
都已排序b
是b
a
- numpy库在环境中可用
- 不需要索引,只需要值
numpy.setdiff1d
导入numpy
>>>a=[1,2,3,4,5,6,7,8,9,10]
>>>b=[1,4,7,10]
>>>numpy.union1d(a,b)
数组([1,2,3,4,5,6,7,8,9,10])
>>>numpy.setdiff1d(a,b)
数组([2,3,5,6,8,9])
您可以使用
unique
和一些排序来定义自己的union
函数
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开始索引。您可以使用
unique
和一些排序来定义自己的union
函数
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开始索引。多亏了这里发布的建议,我找到了一个相当简洁的答案。使用
numpy.intersect1d()
函数,我能够返回我正在寻找的索引。如下所示:其中,m
是列索引,data\u column
最初都是nan
是a
的长度,data\u 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
返回索引
功能是关键。我通过阅读numpy集合函数发现了这一点,我是通过提交的答案找到的。我只是不知道去哪里找,谢谢大家 多亏了这里的建议,我找到了一个相当简洁的答案。使用numpy.intersect1d()
函数,我能够返回我正在寻找的索引。如下所示:其中,m
是列索引,data\u column
最初都是nan
是a
的长度,data\u 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
返回索引
功能是关键。我通过阅读numpy集合函数发现了这一点,我是通过提交的答案找到的。我只是不知道去哪里找,谢谢大家 感谢我们的输入,我实际上是在寻找索引,而不是值。不过,你的回答给了我正确的方向,所以很有帮助!感谢我们的输入,我实际上是在寻找索引,而不是值。不过,你的回答给了我正确的方向,所以很有帮助!您询问了有关联合
,然后回答了关于交叉
?您询问了关于联合
,然后回答了关于交叉
?