合并数组和绘图

时间:2019-03-30 09:55:43

标签: python arrays numpy multidimensional-array

假设我有两个像这样的数组:

x1 = [ 1.2,  1.8,  2.3,  4.5, 20.0]
y1 = [10.3, 11.8, 12.3, 11.5, 11.5]

和其他两个代表相同功能但以不同值采样的

x2 = [ 0.2,  1,8,  5.3, 15.5, 17.2, 18.3, 20.0]
y2 = [10.3, 11.8, 12.3, 12.5, 15.2, 10.3, 10.0]

是否有一种用numpy合并x1和x2的方法,并且根据结果将y的相关值也合并而不显式遍历整个数组? (例如将y取平均值或对该时间间隔取最大值)

3 个答案:

答案 0 :(得分:1)

我不知道您是否可以在numpy中找到某些东西,但这是使用熊猫的解决方案。 (熊猫在幕后使用numpy,因此没有太多数据转换。)

import numpy as np 
import pandas as pd 
x1 = np.asarray([ 1.2,  1.8,  2.3,  4.5, 20.0])
y1 = np.asarray([10.3, 11.8, 12.3, 11.5, 11.5])
x2 = np.asarray([ 0.2,  1.8,  5.3, 15.5, 17.2, 18.3, 20.0])
y2 = np.asarray([10.3, 11.8, 12.3, 12.5, 15.2, 10.3, 10.0])
c1 = pd.DataFrame({'x': x1, 'y': y1})
c2 = pd.DataFrame({'x': x2, 'y': y2})
c = pd.concat([c1, c2]).groupby('x').mean().reset_index()
x = c['x'].values
y = c['y'].values

# Result:
x = array([ 0.2,  1.2,  1.8,  2.3,  4.5,  5.3,  15.5, 17.2, 18.3, 20. ])
y = array([10.3 , 10.3, 11.8, 12.3, 11.5, 12.3, 12.5, 15.2, 10.3, 10.75])

在这里,我将两个向量连接起来,并进行了groupby操作以获取与'x'相等的值。对于这些“组”,我将采用mean()。 reset_index()会将索引“ x”移回一列。为了将结果作为一个numpy数组返回,我使用.values。 (对于24.0及更高版本的熊猫,请使用to_numpy()。)

答案 1 :(得分:0)

如何使用numpy.hstack,然后使用numpy.sort进行排序?

In [101]: x1_arr = np.array(x1)
In [102]: x2_arr = np.array(x2)

In [103]: y1_arr = np.array(y1)
In [104]: y2_arr = np.array(y2)


In [111]: np.sort(np.hstack((x1_arr, x2_arr)))
Out[111]: 
array([ 0.2,  1.2,  1.8,  1.8,  2.3,  4.5,  5.3, 15.5, 17.2, 18.3, 20. ,
       20. ])

In [112]: np.sort(np.hstack((y1_arr, y2_arr)))
Out[112]: 
array([10. , 10.3, 10.3, 10.3, 11.5, 11.5, 11.8, 11.8, 12.3, 12.3, 12.5,
       15.2])

如果要消除重复项,可以在上述结果之上应用numpy.unique

答案 2 :(得分:0)

我会根据this question的公认答案提出解决方案:

import numpy as np
import pylab as plt

x1 = [1.2, 1.8, 2.3, 4.5, 20.0]
y1 = [10.3, 11.8, 12.3, 11.5, 11.5]

x2 = [0.2, 1.8, 5.3, 15.5, 17.2, 18.3, 20.0]
y2 = [10.3, 11.8, 12.3, 12.5, 15.2, 10.3, 10.0]

# create a merged and sorted x array
x = np.concatenate((x1, x2))
ids = x.argsort(kind='mergesort')
x = x[ids]

# find unique values
flag = np.ones_like(x, dtype=bool)
np.not_equal(x[1:], x[:-1], out=flag[1:])

# discard duplicated values
x = x[flag]

# merge, sort and select values for y
y = np.concatenate((y1, y2))[ids][flag]

plt.plot(x, y, marker='s', color='b', ls='-.')
plt.xlabel('x')
plt.ylabel('y')

plt.show()

这是结果: enter image description here

x = [ 0.2  1.2  1.8  2.3  4.5  5.3 15.5 17.2 18.3 20. ] 
y = [10.3 10.3 11.8 12.3 11.5 12.3 12.5 15.2 10.3 11.5]

您注意到,如果同一y有多个可用值,则此代码仅保留x的一个值:这样,代码会更快。

奖金解决方案 :以下解决方案基于循环,主要基于标准的Python函数和对象(非numpy),因此我知道这是不可接受的;顺便说一句,它非常简洁,优雅,并且可以处理y的多个值,因此我决定将其作为加号包含在这里:

x = sorted(set(x1 + x2))
y = np.nanmean([[d.get(i, np.nan) for i in x] 
                for d in map(lambda a: dict(zip(*a)), ((x1, y1), (x2, y2)))], axis=0)

在这种情况下,您得到以下结果:

x = [0.2, 1.2, 1.8, 2.3, 4.5, 5.3, 15.5, 17.2, 18.3, 20.0] 
y = [10.3  10.3  11.8  12.3  11.5  12.3  12.5  15.2  10.3  10.75]