python - 如何获取 n*m 矩阵行的所有可能和的列表

标签 python matrix sum rows

我有这个 csv 格式的 4x10 (nxm) 数据矩阵:

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,但我想将矩阵行分成两半,而不管矩阵尺寸如何。

最佳答案

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

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 等。 )

关于python - 如何获取 n*m 矩阵行的所有可能和的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35547947/

相关文章:

arrays - 算法将数组拆分为子数组,其中所有子数组之间的最大总和尽可能低

python-3.x - 如何对字典中相同键的值求和?

python - 计算略有不同的矩阵乘法

python - 在python中填充/预测矩阵的未知值

python - Theano 矩阵乘法

C++ Armadillo princomp() 段错误

sum - 如何在 SQL 中分散年度金额然后按月添加

python - 如何将空列添加到数据框中?

Python:将一个列表除以另一个列表的长度,并用该除法创建一个字典

python - 不使用 COM/自动化从 Word 文档中提取文本的最佳方法?