如何通过求和将numpy中的矩阵的两个列/行组合在一起?

时间:2018-07-06 19:25:00

标签: python numpy

我正在使用numpy,并试图找出矩阵存在的问题。假设我有一个3 x 3的矩阵,并想通过将第一,第二列和行加在一起将其转换为2 x 2的矩阵。例如,给定:

import numpy as np 
a = [[1,2,3],[4,5,6],[7,8,9]]
m = np.array(a)

显示m个产量:

array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

我想先对第一行和第二行求和:

array([5, 7, 9],
      [7, 8, 9])

然后将第一列和第二列求和以得到:

array([12, 9],
      [15, 9])

这只是一个玩具示例,但实际上我有一个24 x 24的矩阵,我想缩小为4 x 4的矩阵。我有4个不同的整数列表,每个列表代表整个24 x 24矩阵中的不同索引。我想做的是遍历每个列表,并合并在列表中找到其索引的行和列。例如,如果一个列表的索引为[3,4,5],我想遍历此列表并合并行,列3、4和5。您知道如何在numpy中完成此操作吗?

1 个答案:

答案 0 :(得分:1)

您可以使用整数数组索引和numpy的总和中的“轴”选项来执行此操作。例如,以:

开头
import numpy as np
a = np.arange(16).reshape(4,4)
list0 = [0,1,2]
list1 = [3]

初始数组为

array([[ 0,  1,  2,  3],
   [ 4,  5,  6,  7],
   [ 8,  9, 10, 11],
   [12, 13, 14, 15]])

索引列表可用于仅从数组中“选择”所需的行。例如,

a[list0,:]

array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

此外,可以使用numpy的总和中的“ axis = 0”参数将数组的行加在一起,结果是一维数组。例如,

np.sum(a[list0,:],axis=0)

产生

array([12, 15, 18, 21])

像这样总结,我们可以逐行构建行求和的数组:

b = np.zeros((2,a.shape[1]))
b[0,:] = np.sum(a[list0,:],axis=0)
b[1,:] = np.sum(a[list1,:],axis=0)

结果数组为

array([[12., 15., 18., 21.],
   [12., 13., 14., 15.]])

可以对列执行类似的操作,但是使用“ axis = 1”添加列:

c = np.zeros((2,2))
c[:,0] = np.sum(b[:,list0],axis=1)
c[:,1] = np.sum(b[:,list1],axis=1)

产生2x2数组:

array([[45., 21.],
       [39., 15.]])

如果您想以更紧凑的方式进行操作,则可以遍历列表,并使用vstack将它们组合成单个数组:

idx_lists = [list0, list1]
b = np.vstack([np.sum(a[idx_lists[n],:],0) for n in range(2)])

将列堆叠在一起比较麻烦,因为sum返回一个一维数组,将其视为一行。一种解决方案是将行垂直堆叠在一起,并在最后进行转置:

c = np.vstack([np.sum(b[:,idx_lists[n]],1) for n in range(2)]).T