2015-01-31 2 views
5

저는 Python을 처음 사용하고 벡터에 행 크기 (열 크기)를 곱하는 함수를 만들려고합니다. 예 : 여기Python 3 : NumPy가없는 행렬로 벡터 곱하기

multiply([1,0,0,1,0,0], [[0,1],[1,1],[1,0],[1,0],[1,1],[0,1]]) 

[1, 1] 

내 코드 :

def multiply(v, G): 
    result = [] 
    total = 0 
    for i in range(len(G)): 
     r = G[i] 
     for j in range(len(v)): 
      total += r[j] * v[j] 
     result.append(total) 
    return result 

문제는 I는 행렬 (R [J]) 오차를 각 열의 첫 번째 행을 선택하려고 '에서 그 인덱스가 범위를 벗어남 '이 표시됩니다. NumPy를 사용하지 않고 곱셈을 완료하는 다른 방법이 있습니까?

답변

7

Numpythonic 방법 : (두 행렬의 내적을 취득하기 위해 numpy.dot 사용)

In [1]: import numpy as np 

In [3]: np.dot([1,0,0,1,0,0], [[0,1],[1,1],[1,0],[1,0],[1,1],[0,1]]) 
Out[3]: array([1, 1]) 

파이썬 방법 :

두 번째 for 루프의 길이는 len(v)하고 당신이 시도 v에 따라 색인을 생성하므로 색인 오류가 발생합니다. 더 파이썬 방법으로 당신은 목록의 열은 다음 지능형리스트 내에서 starmapmul을 사용하여 얻을 수 zip 기능을 사용할 수 있습니다 :

In [13]: first,second=[1,0,0,1,0,0], [[0,1],[1,1],[1,0],[1,0],[1,1],[0,1]] 

In [14]: from itertools import starmap 

In [15]: from operator import mul 

In [16]: [sum(starmap(mul, zip(first, col))) for col in zip(*second)] 
Out[16]: [1, 1] 
+1

초보자에게 적합하지 않은 모양입니다. – physicalattraction

+1

@physicalattraction 자세한 설명을 추가하겠습니다.) – Kasramvd

+0

고마워요. 나는 우편 번호 기능을 발견하지 못했습니다 - 훨씬 쉬워졌습니다! 마지막으로 합계 (mul (k, t))를 반환하려고 할 때 구문 오류가 발생합니다. 그것은 대괄호 바깥 쪽 괄호로 강조되어 있습니다. – JGraham353

2

rG의 요소이므로 두 요소 만있는 행입니다. 즉, 인덱스 j을 사용하여 r에서 값을 얻을 수 없다는 의미입니다. j이 0에서부터 길이가 v (예 : 6)이되기 때문입니다.

1

는 내가 처음 매트릭스 2 차원이 될 수 솔루션이 필요했습니다. @ Kasramvd에서 2 차원 first 행렬을 허용하도록 솔루션을 확장합니다. 참조를 위해 여기에 게시 됨 :

>>> first,second=[[1,0,0,1,0,0],[0,1,1,1,0,0]], [[0,1],[1,1],[1,0],[1,0],[1,1],[0,1]] 
>>> from itertools import starmap 
>>> from operator import mul 
>>> [[sum(starmap(mul, zip(row, col))) for col in zip(*second)] for row in first] 
[[1, 1], [3, 1]] 
2

나는 당신의 코드에 문제가 있었다 생각 행렬의보다는 열별로 행을 통해 루프. 또한 각 벡터 행렬 열 계산 후에 'total'변수를 재설정하지 않습니다. 이것은 당신이 원하는 :

내가 행렬 곱셈에 대한 코드를 첨부
def multiply(v, G): 
    result = [] 
    for i in range(len(G[0])): #this loops through columns of the matrix 
     total = 0 
     for j in range(len(v)): #this loops through vector coordinates & rows of matrix 
      total += v[j] * G[j][i] 
     result.append(total) 
    return result 
0

def MM(a,b): 
c = [] 
for i in range(0,len(a)): 
    temp=[] 
    for j in range(0,len(b[0])): 
     s = 0 
     for k in range(0,len(a[0])): 
      s += a[i][k]*b[k][j] 
     temp.append(s) 
    c.append(temp) 

return c 
a=[[1,2]] 
b=[[1],[2]] 
print(MM(a,b)) 

결과는 (목록리스트) 한 차원 곱셈에 대한 예제 형식을 따라야 할 [5]