Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按第一列比较两个numpy数组,并通过连接两个数组创建第三个numpy数组_Python_Arrays_Numpy - Fatal编程技术网

Python 按第一列比较两个numpy数组,并通过连接两个数组创建第三个numpy数组

Python 按第一列比较两个numpy数组,并通过连接两个数组创建第三个numpy数组,python,arrays,numpy,Python,Arrays,Numpy,我有两个2d numpy阵列,用于绘制模拟结果 两个数组a和b的第一列包含时间间隔,第二列包含要绘制的数据。这两个数组具有不同的形状a(500,2)b(600,2)。我想按第一列比较这两个numpy数组,并创建第三个数组,其中包含在a的第一列中找到的匹配项。如果未找到匹配项,请将0添加到第三列 这有什么小把戏吗 例如: a=[[0.002,0.998], [0.004,0.997], [0.006,0.996], [0.008,0.995], [0.010,

我有两个2d numpy阵列,用于绘制模拟结果

两个数组
a
b
的第一列包含时间间隔,第二列包含要绘制的数据。这两个数组具有不同的形状
a(500,2)
b(600,2)
。我想按第一列比较这两个numpy数组,并创建第三个数组,其中包含在
a
的第一列中找到的匹配项。如果未找到匹配项,请将0添加到第三列

这有什么小把戏吗

例如:

a=[[0.002,0.998],  
  [0.004,0.997],   
  [0.006,0.996],   
  [0.008,0.995],   
  [0.010,0.993]]   

b= [[0.002,0.666],  
    [0.004,0.665],  
    [0.0041,0.664], 
    [0.0042,0.664], 
    [0.0043,0.664], 
    [0.0044,0.663], 
    [0.0045,0.663], 
    [0.0005,0.663], 
    [0.006,0.663], 
    [0.0061,0.662],
    [0.008,0.661]] 
预期产量

c= [[0.002,0.998,0.666],       
    [0.004,0.997,0.665],           
    [0.006,0.996,0.663],           
    [0.008,0.995,0.661],
    [0.010,0.993, 0   ]]  

我很快就能想到解决办法

import numpy as np

a = np.array([[0.002, 0.998],
     [0.004, 0.997],
     [0.006, 0.996],
     [0.008, 0.995],
     [0.010, 0.993]])

b = np.array([[0.002, 0.666],
     [0.004, 0.665],
     [0.0041, 0.664],
     [0.0042, 0.664],
     [0.0043, 0.664],
     [0.0044, 0.663],
     [0.0045, 0.663],
     [0.0005, 0.663],
     [0.0006, 0.663],
     [0.00061, 0.662],
     [0.0008, 0.661]])


c = []
for row in a:
    index = np.where(b[:,0] == row[0])[0]
    if np.size(index) != 0:
      c.append([row[0], row[1], b[index[0], 1]])
    else:
      c.append([row[0], row[1], 0])

print c

正如上面的评论所指出的,似乎存在数据输入错误

我可以很快地认为解决方案如下

import numpy as np

a = np.array([[0.002, 0.998],
     [0.004, 0.997],
     [0.006, 0.996],
     [0.008, 0.995],
     [0.010, 0.993]])

b = np.array([[0.002, 0.666],
     [0.004, 0.665],
     [0.0041, 0.664],
     [0.0042, 0.664],
     [0.0043, 0.664],
     [0.0044, 0.663],
     [0.0045, 0.663],
     [0.0005, 0.663],
     [0.0006, 0.663],
     [0.00061, 0.662],
     [0.0008, 0.661]])


c = []
for row in a:
    index = np.where(b[:,0] == row[0])[0]
    if np.size(index) != 0:
      c.append([row[0], row[1], b[index[0], 1]])
    else:
      c.append([row[0], row[1], 0])

print c
import numpy as np
i = np.intersect1d(a[:,0], b[:,0])
overlap = np.vstack([i, a[np.in1d(a[:,0], i), 1], b[np.in1d(b[:,0], i), 1]]).T
underlap = np.setdiff1d(a[:,0], b[:,0])
underlap = np.vstack([underlap, a[np.in1d(a[:,0], underlap), 1], underlap*0]).T
fast_c = np.vstack([overlap, underlap])
如上所述,似乎存在数据输入错误

import numpy as np
i = np.intersect1d(a[:,0], b[:,0])
overlap = np.vstack([i, a[np.in1d(a[:,0], i), 1], b[np.in1d(b[:,0], i), 1]]).T
underlap = np.setdiff1d(a[:,0], b[:,0])
underlap = np.vstack([underlap, a[np.in1d(a[:,0], underlap), 1], underlap*0]).T
fast_c = np.vstack([overlap, underlap])
这是通过使用获取
a
b
的第一列的交点,然后使用与第二列的交点进行交叉引用来实现的

vstack
垂直堆叠输入元素,需要转置以获得正确的维度(非常快速的操作)

然后使用在
a
中查找不在
b
中的时间,并在第三列中输入0来完成结果

这是打印出来的

array([[ 0.002,  0.998,  0.666],
       [ 0.004,  0.997,  0.665],
       [ 0.006,  0.996,  0.   ],
       [ 0.008,  0.995,  0.   ],
       [ 0.01 ,  0.993,  0.   ]])
这是通过使用获取
a
b
的第一列的交点,然后使用与第二列的交点进行交叉引用来实现的

vstack
垂直堆叠输入元素,需要转置以获得正确的维度(非常快速的操作)

然后使用在
a
中查找不在
b
中的时间,并在第三列中输入0来完成结果

这是打印出来的

array([[ 0.002,  0.998,  0.666],
       [ 0.004,  0.997,  0.665],
       [ 0.006,  0.996,  0.   ],
       [ 0.008,  0.995,  0.   ],
       [ 0.01 ,  0.993,  0.   ]])

以下内容适用于numpy数组和简单python列表

c = [[*x, y[1]] for x in a for y in b if x[0] == y[0]]
d = [[*x, 0] for x in a if x[0] not in [y[0] for y in b]]
c.extend(d)

比我勇敢的人可以尝试写这一行。

以下内容适用于numpy数组和简单python列表

c = [[*x, y[1]] for x in a for y in b if x[0] == y[0]]
d = [[*x, 0] for x in a if x[0] not in [y[0] for y in b]]
c.extend(d)

比我勇敢的人可以试着把这一行写出来。

你能把
a
b
放在不同的行上以便于将数据复制到IPython吗?我已经把“a”和“b”编辑成两行
a
有6e-3,而
b
有6e-4,而
c
又有6e-3,在它们的第一列。这是数据输入错误吗?c是预期输出,a和b是两个输入,a和b的第一列是时间间隔,如[0.002,0.004],第三个数组c必须包含a和b的匹配时间间隔,其数据在第二列
a[2,0]
约为6*10**-3。但是
b[9,0]
是6*10**-4。10个不同的系数。我想你有数据输入错误。你能把
a
b
放在不同的行上以便于将数据复制到IPython吗?我已经将“a”和“b”编辑到两个不同的行
a
有6e-3,而
b
有6e-4,而
c
又有6e-3,在它们的第一列。这是数据输入错误吗?c是预期输出,a和b是两个输入,a和b的第一列是时间间隔,如[0.002,0.004],第三个数组c必须包含a和b的匹配时间间隔,其数据在第二列
a[2,0]
约为6*10**-3。但是
b[9,0]
是6*10**-4。10个不同的系数。我想你有一个数据输入错误。