Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何获得n*m矩阵行的所有可能和的列表_Python_Matrix_Sum_Rows - Fatal编程技术网

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

Python 如何获得n*m矩阵行的所有可能和的列表,python,matrix,sum,rows,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 所有可

我有一个csv格式的
4x10
n
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])

问题是我使用
数据[0][I]
数据[1][I]
数据[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等)

我可以根据您计划如何处理例如a
6x10
matrix来编辑我的答案,因为这将决定外部循环的外观。您是否也可以尝试将第三行与第一行和第二行相加?@M.T是否可以实现这样的逻辑,在任何指定的行数上都可以工作?如果矩阵中的行总数分别为4、6、8或10,我可能需要得到2、3或4或5行的所有可能的和列表(因为我试图得到某个矩阵的一半的和列表)。例如,不提供4x10矩阵,我可以提供6x10矩阵,它仍然返回前3行(而不是2行)的所有可能的总和列表。