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