我在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
几行,我也做同样的事情。
在第一行的所有可能总和下,我的意思是:
示例:
第11, 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等)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句