Indexing/reshaping 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 循环的有效方法?也许使用 broadcasting or strides?
您可以 reshape the array in Fortran order (or use a combination of transpositions) and then slice 数组仅提取前 7 行:
a.reshape(50, -1, order='F')[:7,:]
此处选择的新形状是基于阵列中形状的位置。当您展平数组、Fortran 顺序时,这一点变得很清楚,然后您会看到您的模式出现。
首先,创建一个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. ]])
并通过更多切片去掉最后几行。
我有一个如下所示的 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 循环的有效方法?也许使用 broadcasting or strides?
您可以 reshape the array in Fortran order (or use a combination of transpositions) and then slice 数组仅提取前 7 行:
a.reshape(50, -1, order='F')[:7,:]
此处选择的新形状是基于阵列中形状的位置。当您展平数组、Fortran 顺序时,这一点变得很清楚,然后您会看到您的模式出现。
首先,创建一个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. ]])
并通过更多切片去掉最后几行。