如何获得n * m矩阵行的所有可能总和的列表

时间:2016-02-22 07:26:08

标签: python matrix sum rows

我在csv中有这个4x10n x m)数据矩阵:

1, 5, 19, 23, 7, 51, 18, 20, 35, 41
15, 34, 17, 8, 11, 93, 13, 46, 3, 10
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
10, 9, 8, 7, 6, 5, 4, 3, 2, 1

首先,我尝试从第一行n/2行获取所有可能总和的列表。剩下的最后n/2行我也是这样做的。

在第一行的所有可能总和中,我的意思如下:

例:
第1行:1, 2, 3
第2行:3, 2, 1

所有可能的汇总列表1 + [3, 2, 1]; 2 + [3, 2, 1]; 3 + [3, 2, 1]

最终列表[4, 3, 2, 5, 4, 3, 6, 5, 4] (目前我不想删除重复项)

对于我的逻辑,我有这个代码:

import csv

def loadCsv(filename):
    lines = csv.reader(open(filename, "rb"))
    dataset = list(lines)
    for i in range(len(dataset)):
        dataset[i] = [float(x) for x in dataset[i]]
    return dataset

data = loadCsv('btest2.txt')
divider = len(data)/2

firstPossibleSumsList = []
secondPossibleSumsList = []


#Possible sum list for the first n/2 rows:
for i in range(len(data[0])):
    for j in range(len(data[0])):
        firstPossibleSumsList.append(data[0][i] + data[1][j])

#Possible sum list for the last n/2 rows:
for i in range(len(data[0])):
    for j in range(len(data[0])):
        secondPossibleSumsList.append(data[2][i] + data[3][j])

问题是我使用data[0][i]data[1][i]data[2][i]等手动划分行。我希望通过涉及divider变量来更高效地完成它,但我无法弄清楚如何。在我的代码中,我依赖于整数0, 1, 2, 3,但我想将矩阵行分成两半而不管矩阵的大小。

1 个答案:

答案 0 :(得分:1)

一种选择是将其视为向量和转置向量的总和。然后你可以这样做:

import numpy as np

data = np.array(loadCsv('btest2.txt'))

firstPossibleSumsArray = (data[0,:,np.newaxis] + data[1]).flatten()

#output for first two columns:
array([  15,   34,   17,    8,   11,   93,   13,   46,    3,   10,   75,
    170,   85,   40,   55,  465,   65,  230,   15,   50,  285,  646,
    323,  152,  209, 1767,  247,  874,   57,  190,  345,  782,  391,
    184,  253, 2139,  299, 1058,   69,  230,  105,  238,  119,   56,
     77,  651,   91,  322,   21,   70,  765, 1734,  867,  408,  561,
   4743,  663, 2346,  153,  510,  270,  612,  306,  144,  198, 1674,
    234,  828,   54,  180,  300,  680,  340,  160,  220, 1860,  260,
    920,   60,  200,  525, 1190,  595,  280,  385, 3255,  455, 1610,
    105,  350,  615, 1394,  697,  328,  451, 3813,  533, 1886,  123,
    410])

最后一个展平是将其从10x10数组转换为100x1数组,这不是必需的。

使用数组的缺点是它们在调整大小/附加数据方面不够灵活。

编辑:

完整的代码可以是:

div = int(data.shape[0])
row_len_squared = int(data.shape[1]**2)

firstPossibleSumsArray = np.empty( int((div*(div-1))/2 * row_len_squared), dtype=int )

idx = 0
for row in range(div):
    for col in range(row+1,div):
        firstPossibleSumsArray[idx:idx+row_len_squared] = \
            (data[row,:,np.newaxis] + data[col]).flatten()
        idx += row_len_squared
#reapeat process for second possible sums array by replacing the range 
#in the first loop from range(div) to range(div,2*div)            

这将遍历每一行,并将其与矩阵一半中的剩余行相加(行#1 +行#2,...,行#1 +行#n,行#2 +行#3等)。 )