Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.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数组和一个公共维度_Python_Pandas_Numpy_Dataframe - Fatal编程技术网

Python &引用;“合并”;numpy数组和一个公共维度

Python &引用;“合并”;numpy数组和一个公共维度,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我有两个矩阵,对应于数据点(x,y1)和(x,y2): 我想创建一个新的矩阵,将x值组合成一列,并在相应的y1,y2列中包含NaNs: x | y1 | y2 ----------------------------- 0 | 0 | NaN 0.5 | NaN | 0.5 1 | 0 | NaN 1.5 | NaN | 1.5 ... | ...

我有两个矩阵,对应于数据点
(x,y1)
(x,y2)

我想创建一个新的矩阵,将
x
值组合成一列,并在相应的
y1
y2
列中包含
NaN
s:

    x    |    y1    |   y2
-----------------------------
    0    |     0    |  NaN
    0.5  |    NaN   |  0.5
    1    |     0    |  NaN
    1.5  |    NaN   |  1.5
    ...  |    ...   |  ...
    5    |     5    |  NaN
    5.5  |    NaN   |  5.5 

有没有一个简单的方法可以做到这一点?我是Python和NumPy的新手(来自MATLAB),我甚至不知道如何从这开始。(作为参考,我在MATLAB中的方法只是对生成的两个表使用一个参数。)

如果可以将数据加载到单独的
数据帧中,这就变得简单了

df

   x  y1
0  0   0
1  1   1
2  2   2
3  3   3
4  4   4
5  5   5

df2

     x   y2
0  0.5  0.5
1  1.5  1.5
2  2.5  2.5
3  3.5  3.5
4  4.5  4.5
5  5.5  5.5
执行外部
合并
,并在
x
列上排序

df = df.merge(df2, how='outer').sort_values('x')
df

      x   y1   y2
0     0    0  NaN
6   0.5  NaN  0.5
1     1    1  NaN
7   1.5  NaN  1.5
2     2    2  NaN
8   2.5  NaN  2.5
3     3    3  NaN
9   3.5  NaN  3.5
4     4    4  NaN
10  4.5  NaN  4.5
5     5    5  NaN
11  5.5  NaN  5.5
如果需要数组,请对结果调用
.values

df.values

array([[0.0, 0.0, nan],
       [0.5, nan, 0.5],
       [1.0, 1.0, nan],
       [1.5, nan, 1.5],
       [2.0, 2.0, nan],
       [2.5, nan, 2.5],
       [3.0, 3.0, nan],
       [3.5, nan, 3.5],
       [4.0, 4.0, nan],
       [4.5, nan, 4.5],
       [5.0, 5.0, nan],
       [5.5, nan, 5.5]], dtype=object)

考虑到您可能不需要其他任何东西,这是标准的lib解决方案

我会把它分解成两个列表(假设元素的顺序很重要)。所以

然后将这些列表合并到列表x中,在x[i][1]或x[i][2]位置交替添加“NaN”,以补偿不存在的替代角色。每个x[i][0]都是dictionary元素的键,其值是上面列出的两个元素的列表

finalx = {item[0]: item[1:] for item in x}

finalx = {0:[0, 'NaN'],0.5:[NaN,0.5],......]

希望这有帮助。这更像是一个方向,而不是一个解决方案。

这里有一个简单的
numpy
的尝试。它创建一个包含3列的矩阵,行数与
a1+a2
相同。它在列中写入
a1
a2
,并按行的第一个值对行进行排序

请注意,只有当
x
值不相交时,它才起作用:

import numpy as np
x = np.arange(6)
# array([0, 1, 2, 3, 4, 5])
a1 = np.vstack((x,x)).T
# array([[0, 0],
#        [1, 1],
#        [2, 2],
#        [3, 3],
#        [4, 4],
#        [5, 5]])
a2 = a1 + 0.5
# array([[ 0.5,  0.5],
#        [ 1.5,  1.5],
#        [ 2.5,  2.5],
#        [ 3.5,  3.5],
#        [ 4.5,  4.5],
#        [ 5.5,  5.5]])
m = np.empty((12, 3))
m[:] = np.nan
# array([[ nan,  nan,  nan],
#        [ nan,  nan,  nan],
#        [ nan,  nan,  nan],
#        [ nan,  nan,  nan],
#        [ nan,  nan,  nan],
#        [ nan,  nan,  nan],
#        [ nan,  nan,  nan],
#        [ nan,  nan,  nan],
#        [ nan,  nan,  nan],
#        [ nan,  nan,  nan],
#        [ nan,  nan,  nan],
#        [ nan,  nan,  nan]])
m[:6, :2] = a1
# array([[  0.,   0.,  nan],
#        [  1.,   1.,  nan],
#        [  2.,   2.,  nan],
#        [  3.,   3.,  nan],
#        [  4.,   4.,  nan],
#        [  5.,   5.,  nan],
#        [ nan,  nan,  nan],
#        [ nan,  nan,  nan],
#        [ nan,  nan,  nan],
#        [ nan,  nan,  nan],
#        [ nan,  nan,  nan],
#        [ nan,  nan,  nan]])
m[6:, ::2] = a2
# array([[ 0. ,  0. ,  nan],
#        [ 1. ,  1. ,  nan],
#        [ 2. ,  2. ,  nan],
#        [ 3. ,  3. ,  nan],
#        [ 4. ,  4. ,  nan],
#        [ 5. ,  5. ,  nan],
#        [ 0.5,  nan,  0.5],
#        [ 1.5,  nan,  1.5],
#        [ 2.5,  nan,  2.5],
#        [ 3.5,  nan,  3.5],
#        [ 4.5,  nan,  4.5],
#        [ 5.5,  nan,  5.5]])
m[m[:,0].argsort()]
# array([[ 0. ,  0. ,  nan],
#        [ 0.5,  nan,  0.5],
#        [ 1. ,  1. ,  nan],
#        [ 1.5,  nan,  1.5],
#        [ 2. ,  2. ,  nan],
#        [ 2.5,  nan,  2.5],
#        [ 3. ,  3. ,  nan],
#        [ 3.5,  nan,  3.5],
#        [ 4. ,  4. ,  nan],
#        [ 4.5,  nan,  4.5],
#        [ 5. ,  5. ,  nan],
#        [ 5.5,  nan,  5.5]])

在这里使用是正确的方法。

结构化数组方法(不完整):

输入一个特殊的函数库:

In [441]: import numpy.lib.recfunctions as rf
定义两个结构化数组

In [442]: A = np.zeros((6,),[('x',int),('y',int)])
哎呀,
B
中的'x
键是浮动的,因此为了保持一致性,让我们将
A`one也设为浮动的。不要不必要地混合浮点和整数

In [446]: A = np.zeros((6,),[('x',float),('y',int)])
In [447]: A['x']=np.arange(6)
In [448]: A['y']=np.arange(6)
In [449]: A
Out[449]: 
array([( 0., 0), ( 1., 1), ( 2., 2), ( 3., 3), ( 4., 4), ( 5., 5)],
      dtype=[('x', '<f8'), ('y', '<i4')])

In [450]: B = np.zeros((6,),[('x',float),('z',float)])
In [451]: B['x']=np.linspace(.5,5.5,6)
In [452]: B['z']=np.linspace(.5,5.5,6)
In [453]: B
Out[453]: 
array([( 0.5,  0.5), ( 1.5,  1.5), ( 2.5,  2.5), ( 3.5,  3.5),
       ( 4.5,  4.5), ( 5.5,  5.5)],
      dtype=[('x', '<f8'), ('z', '<f8')])
进行
外部连接
连接:

In [457]: rf.join_by('x',A,B,'outer')
Out[457]: 
masked_array(data = [(0.0, 0, --) (0.5, --, 0.5) (1.0, 1, --) (1.5, --, 1.5) (2.0, 2, --)
 (2.5, --, 2.5) (3.0, 3, --) (3.5, --, 3.5) (4.0, 4, --) (4.5, --, 4.5)
 (5.0, 5, --) (5.5, --, 5.5)],
             mask = [(False, False,  True) (False,  True, False) (False, False,  True)
 (False,  True, False) (False, False,  True) (False,  True, False)
 (False, False,  True) (False,  True, False) (False, False,  True)
 (False,  True, False) (False, False,  True) (False,  True, False)],
       fill_value = (  1.00000000e+20, 999999,   1.00000000e+20),
            dtype = [('x', '<f8'), ('y', '<i4'), ('z', '<f8')])
[457]中的
:rf.通过('x',A,B,'outer')连接
Out[457]:
掩蔽数组(数据=[(0.0,0,--)(0.5,--0.5)(1.0,1,--)(1.5,--1.5)(2.0,2,--)
(2.5, --, 2.5) (3.0, 3, --) (3.5, --, 3.5) (4.0, 4, --) (4.5, --, 4.5)
(5.0, 5, --) (5.5, --, 5.5)],
面具=[(假,假,真)(假,真,假)(假,假,真)
(假,真,假)(假,假,真)(假,真,假)
(假,假,真)(假,真,假)(假,假,真)
(假,真,假)(假,假,真)(假,真,假)],
填充值=(1.00000000e+209999,1.00000000e+20),

dtype=[('x','你有熊猫吗?@cᴏʟᴅsᴘᴇᴇᴅ 我可以安装它,更多的软件包没什么大不了的。你会如何使用MATLAB?你会使用什么样的结构?@hpaulj编辑了一个问题,将我的解决方案包含在MATLAB中。我会将我的两个矩阵转换成表,然后做一个
outerjoin
。使用纯
numpy
这和在MATLAB中只使用
matrix
一样尴尬。我可以n使用结构化数组(和
recfunctions.join
)对其进行近似,这些数组与MATLAB
struct
(请参阅).
pandas
更适合于
table
之类的操作。很好。在这里使用pandas是有意义的。基本上你需要混合使用numpy数组和Python dict。@EricDuminil谢谢你。这对我来说似乎是最轻松的选择。不过,我看到了你的答案,这似乎给人留下了深刻的印象(我不可能像你那样想到一个numpy解决方案)并向你投了一票:)
In [446]: A = np.zeros((6,),[('x',float),('y',int)])
In [447]: A['x']=np.arange(6)
In [448]: A['y']=np.arange(6)
In [449]: A
Out[449]: 
array([( 0., 0), ( 1., 1), ( 2., 2), ( 3., 3), ( 4., 4), ( 5., 5)],
      dtype=[('x', '<f8'), ('y', '<i4')])

In [450]: B = np.zeros((6,),[('x',float),('z',float)])
In [451]: B['x']=np.linspace(.5,5.5,6)
In [452]: B['z']=np.linspace(.5,5.5,6)
In [453]: B
Out[453]: 
array([( 0.5,  0.5), ( 1.5,  1.5), ( 2.5,  2.5), ( 3.5,  3.5),
       ( 4.5,  4.5), ( 5.5,  5.5)],
      dtype=[('x', '<f8'), ('z', '<f8')])
In [454]: rf.join_by?
In [457]: rf.join_by('x',A,B,'outer')
Out[457]: 
masked_array(data = [(0.0, 0, --) (0.5, --, 0.5) (1.0, 1, --) (1.5, --, 1.5) (2.0, 2, --)
 (2.5, --, 2.5) (3.0, 3, --) (3.5, --, 3.5) (4.0, 4, --) (4.5, --, 4.5)
 (5.0, 5, --) (5.5, --, 5.5)],
             mask = [(False, False,  True) (False,  True, False) (False, False,  True)
 (False,  True, False) (False, False,  True) (False,  True, False)
 (False, False,  True) (False,  True, False) (False, False,  True)
 (False,  True, False) (False, False,  True) (False,  True, False)],
       fill_value = (  1.00000000e+20, 999999,   1.00000000e+20),
            dtype = [('x', '<f8'), ('y', '<i4'), ('z', '<f8')])
In [460]: rf.join_by('x',A,B,'outer',usemask=False)
Out[460]: 
array([( 0. ,      0,   1.00000000e+20), ( 0.5, 999999,   5.00000000e-01),
       ( 1. ,      1,   1.00000000e+20), ( 1.5, 999999,   1.50000000e+00),
       ( 2. ,      2,   1.00000000e+20), ( 2.5, 999999,   2.50000000e+00),
       ( 3. ,      3,   1.00000000e+20), ( 3.5, 999999,   3.50000000e+00),
       ( 4. ,      4,   1.00000000e+20), ( 4.5, 999999,   4.50000000e+00),
       ( 5. ,      5,   1.00000000e+20), ( 5.5, 999999,   5.50000000e+00)],
      dtype=[('x', '<f8'), ('y', '<i4'), ('z', '<f8')])