2017-02-15 78 views
0

我在Python非常初学者。 我有矩阵乘法的问题。 我使用列表(矩阵)列表从txt文件中读取矩阵。矩阵乘法在Python,多处理

当我想用多我有鸿沟列出了问题和池功能使用新的列表。

我该如何解决这个问题?

请从评论帮助

def matrix_multiplication(list1, list2): 
    A = numpy.matrix(list1) 
    B = numpy.matrix(list2) 
    return A*B 

def counting(dane): 

    left_matrix = matrices[0] 

    for matrix in matrices[1:]: 
     left_matrix = numpy.matrix(left_matrix) 
     matrix = numpy.matrix(matrix) 
     left_matrix = matrix_multiplication(left_matrix, matrix) 


if __name__ == "__main__": 


    matrices = [] 
    with open('sample-probka2.txt', 'r') as file: 
     matrix_reader = csv.reader(file, delimiter=';') 
     current_matrix = [] 

     for row in matrix_reader: 
      if len(row) == 0: 
       matrices.append(current_matrix) 
       current_matrix = [] 
      else: 
       current_matrix.append(list(map(float, row))) 

    print (matrices) 

    counting(matrices) 


    np = multiprocessing.cpu_count() 
    print('You have', np, 'processors') 


    matrices2 = numpy.array_split(matrices, np) 
    print(matrices2) 


    pool = Pool(processes=np) 
    count = pool.starmap(liczenie, matrices2) 
    print count 

错误,与企图恢复格式化:

multiprocessing.pool.RemoteTraceback: 
Traceback (most recent call last): 
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/pytho‌​n3.6/multiprocessing‌​/pool.py", 
line 119, in worker result = (True, func(*args, **kwds)) 
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/pytho‌​n3.6/multiprocessing‌​/pool.py", line 47, 
in starmapstar return list(itertools.starmap(args[0], args[1])) TypeError: counting() takes 1 positional argument but 61 were given 
+0

你得到的错误是什么? – Aaron

+0

multiprocessing.pool.RemoteTraceback: “”“ Traceback(最近呼叫的最后一个): File”/Library/Frameworks/Python.framework/Versions/3。6/lib/python3.6/multiprocessing/pool.py“,第119行,在worker result =(True,func(* args,** kwds)) File”/Library/Frameworks/Python.framework/Versions/ 3.6/lib/python3.6/multiprocessing/pool.py“,第47行,在starmapstar 返回列表(itertools.starmap(args [0],args [1])) TypeError:counting()取1个位置参数,但61给予 “”“ –

+0

在我看来,我应该修改'矩阵2'。在这种情况下,我不能使用'pool.starmap(计数,矩阵2)。我应该改变一些东西,但我不知道是什么。 –

回答

0

我不认为你想在这种情况下pool.starmap。它在做什么是每个矩阵拆包到61层的元件,因为它是交给counting()仅期望一个参数。

docs:

starmap(func, iterable[, chunksize])

Like map() except that the elements of the iterable are expected to be iterables that are unpacked as arguments.

Hence an iterable of [(1,2), (3, 4)] results in [func(1,2), func(3,4)].

,你可以在多种方式解决这个问题,但我认为最明智的方法是使用pool.map代替,因为它不会把你的投入,让他们作为一个单一的变量。你也可以定义counting(*dane)以允许可变数量的输入连接到列表dane(在功能中你不使用,但我会留给你弄清楚如何处理它)。

0

count = pool.starmap(liczenie, matrices2) 

是什么liczenie?我在代码中看不到这样的功能。错误消息表明它是counting

但是在counting(dane),dane从不使用。

它看起来像matrices是浮动列表的列表。所有的子列表都是相同的长度吗?如果是这样,你为什么不读csv文件与numpy的管理器,例如np.genfromtxt?但这是一个侧面。

是否counting(matrices)工作?除了搞砸的调用参数之外,它不会返回任何东西。我猜它应该是做链式矩阵产品,M1*M2*M3*...* for np.matrix是矩阵乘积,而不是逐元素(*np.array())。

但是,这是行不通的; np.matrix(alist)是(1,n)矩阵。它无法复制其他(1,N)矩阵,不管有多少次你把它包在np.matrix(你为什么做几次?)

In [25]: M1 = np.matrix([1,2,3,4]) 
In [26]: M1*M1 
.... 
ValueError: shapes (1,4) and (1,4) not aligned: 4 (dim 1) != 1 (dim 0) 

什么是多重的目的是什么?什么是应该这样做,一个电话修正counting不能做?