Python 如何获得n*m矩阵行的所有可能和的列表
我有一个csv格式的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 所有可
4x10
(n
xm
)数据矩阵:
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行)的所有可能的总和列表。