繁体   English   中英

Python中的索引/重塑矩阵以匹配目标矩阵

[英]Indexing/reshaping matrix in Python to match target matrix

我有一个NumPy数组,如下所示:

>>> import numpy

>>> foo = numpy.array(
    [[ 1.    ,  0.3491,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
       1.    ,  0.1648,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
       1.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
       1.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
       1.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ],
     [ 0.4269,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
       0.225 ,  0.1637,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
       0.4269,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
       0.2929,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
       0.4078,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ],
     [ 0.4212,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
       0.1719,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
       0.3856,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
       0.147 ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
       0.2459,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ],
     [ 0.3581,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
       0.1676,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
       0.2545,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
       0.0619,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
       0.2195,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ],
     [ 0.3558,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
       0.1658,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
       0.2544,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
       0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
       0.2159,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ]])

我想对其重新编制索引并重新定型,使其变为以下形式:

>>> bar
array(
[[ 1.    ,  1.    ,  1.    ,  1.    ,  1.    ],
 [ 0.4269,  0.225 ,  0.4269,  0.2929,  0.4078],
 [ 0.4212,  0.1719,  0.3856,  0.147 ,  0.2459],
 [ 0.3581,  0.1676,  0.2545,  0.0619,  0.2195],
 [ 0.3558,  0.1658,  0.2544,  0.    ,  0.2159],
 [ 0.3491,  0.1648,  0.    ,  0.    ,  0.    ],
 [ 0.    ,  0.1637,  0.    ,  0.    ,  0.    ]])

有没有一种有效的方法,而无需使用for循环? 也许使用广播还是大步前进

首先,创建一个numpy数组:

import numpy as np
arr = np.asarray(a)

arr

array([[ 1.    ,  0.3491,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
     0.    ,  0.    ,  0.    ,  1.    ,  0.1648,  0.    ,  0.    ,
     0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  1.    ,
     0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
     0.    ,  0.    ,  1.    ,  0.    ,  0.    ,  0.    ,  0.    ,
     0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  1.    ,  0.    ,
     0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ],
   [ 0.4269,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
     0.    ,  0.    ,  0.    ,  0.225 ,  0.1637,  0.    ,  0.    ,
     0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.4269,
     0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
     0.    ,  0.    ,  0.2929,  0.    ,  0.    ,  0.    ,  0.    ,
     0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.4078,  0.    ,
     0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ],
   [ 0.4212,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
     0.    ,  0.    ,  0.    ,  0.1719,  0.    ,  0.    ,  0.    ,
     0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.3856,
     0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
     0.    ,  0.    ,  0.147 ,  0.    ,  0.    ,  0.    ,  0.    ,
     0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.2459,  0.    ,
     0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ],
   [ 0.3581,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
     0.    ,  0.    ,  0.    ,  0.1676,  0.    ,  0.    ,  0.    ,
     0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.2545,
     0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
     0.    ,  0.    ,  0.0619,  0.    ,  0.    ,  0.    ,  0.    ,
     0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.2195,  0.    ,
     0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ],
   [ 0.3558,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
     0.    ,  0.    ,  0.    ,  0.1658,  0.    ,  0.    ,  0.    ,
     0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.2544,
     0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
     0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,
     0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.2159,  0.    ,
     0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ,  0.    ]])

然后,切成薄片:

b = arr[:,0:50:10]

Out[13]: array([[ 1.    ,  1.    ,  1.    ,  1.    ,  1.    ],
   [ 0.4269,  0.225 ,  0.4269,  0.2929,  0.4078],
   [ 0.4212,  0.1719,  0.3856,  0.147 ,  0.2459],
   [ 0.3581,  0.1676,  0.2545,  0.0619,  0.2195],
   [ 0.3558,  0.1658,  0.2544,  0.    ,  0.2159]])

然后,堆叠要保留的其他数据:

c = arr[:,1:50:10]

np.vstack((b,c))
Out[17]: 
array([[ 1.    ,  1.    ,  1.    ,  1.    ,  1.    ],
   [ 0.4269,  0.225 ,  0.4269,  0.2929,  0.4078],
   [ 0.4212,  0.1719,  0.3856,  0.147 ,  0.2459],
   [ 0.3581,  0.1676,  0.2545,  0.0619,  0.2195],
   [ 0.3558,  0.1658,  0.2544,  0.    ,  0.2159],
   [ 0.3491,  0.1648,  0.    ,  0.    ,  0.    ],
   [ 0.    ,  0.1637,  0.    ,  0.    ,  0.    ],
   [ 0.    ,  0.    ,  0.    ,  0.    ,  0.    ],
   [ 0.    ,  0.    ,  0.    ,  0.    ,  0.    ],
   [ 0.    ,  0.    ,  0.    ,  0.    ,  0.    ]])

随着更多的切片摆脱最后几行。

您可以按Fortran顺序重新排列数组的形状(或使用转置的组合),然后切片数组以仅提取前7行:

a.reshape(50, -1, order='F')[:7,:]

此处选择的新形状基于阵列中这些形状的位置。 当您展平阵列(Fortran顺序),然​​后看到您的模式出现时,这一点变得很清楚。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM