【问题标题】:How to get list of all possible sums of n*m matrix rows如何获取n * m矩阵行的所有可能总和的列表
【发布时间】:2023-12-11 23:51:01
【问题描述】:

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

【问题讨论】:

  • 我可以编辑我的答案,具体取决于您计划如何治疗,例如。 6x10 矩阵,因为这将决定外循环的外观。您是否也尝试将第三行与第一行和第二行相加?
  • @M.T 是否有可能实现适用于任何指定行数的逻辑?如果矩阵中的总行数分别为 4、6、8 或 10,我可能需要获取 2、3 的所有可能的总和列表,或者可能是 4 或 5 行(因为我试图获得一半的总和列表一些矩阵)。例如,我可以提供 6x10 矩阵而不是提供 4x10 矩阵,它仍然返回前 3 行(而不是 2 行)的所有可能总和列表。

标签: python matrix sum rows


【解决方案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 等。 )

【讨论】: