我有这个 csv 格式的 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])
问题是我使用 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 等。 )
关于python - 如何获取 n*m 矩阵行的所有可能和的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35547947/