2012-06-20 4 views
0

Я пытаюсь умножить два массива без использования numpy. Но, я получаю сообщение об ошибке на строке «multi = a [i] * b [j]», в которой указано, что индекс вне диапазона.умножение массива

a = [1,2,3] 
b = [4,5,6] 

multi = [0,0,0,0,0,0,0,0] 

for i in a: 
    for j in b: 
     multi = a[i]*b[j] 
     append.multi(y) 

print multi 
+1

. .. и откуда взялся? –

+0

Не считая всех других проблем с вашим кодом, почему вы не хотите использовать numpy для начала? Потому что с numpy решением будет 'a = numpy.array ([[1, 2, 3]]); b = numpy.array ([[4, 5, 6]]); multi = (a * bT) .flatten() ', и в то время как версия, отличная от numpy, с использованием списков, выполняется быстрее для трехэлементных списков, которые вы использовали в качестве примера, когда вы получаете хотя бы 10 элементов в списке, версия numpy будет быстрее. – JAB

+0

(На моем компьютере: с 3 элементами в списке требуется около 9 секунд для версии numpy и 3 секунды для версии без numpy, в то время как по 10 в списке требуется около 10 секунд для версии numpy и 16 секунд для non-numpy one.) – JAB

ответ

4

Давайте начнем с того, что вы пытались. Для цикла:

a = [1,2,3] 
b = [4,5,6] 

ab = [] 

for x in a: 
    for y in b: 
     ab.append(x * y) 

print(ab) 

[4, 5, 6, 8, 10, 12, 12, 15, 18] 

Теперь, я хотел бы предложить вы прочитанный здесь python data structures

После того, как вы понимаете, как использовать цикл, понимание списковых легко.

То же самое для цикла, но результаты идут прямо в список. это мило. На самом деле это так приятно, что почти все делают это так.

a = [1,2,3] 
b = [4,5,6] 

ab = [ x * y for x in a for y in b ] 

print(ab) 

[4, 5, 6, 8, 10, 12, 12, 15, 18] 

так, вместо for ... ab.append(x * y) мы пишем [ x * y for ... ]

теперь, если код был написан так:

ab = (x * y for x in a for y in b) 

это сделало бы его генератор. Многие люди тоже используют их. Подумайте об этом как о ленивых списках. Вы можете поместить в него вещи, но это не оценивается, пока вы не попытаетесь что-то сделать с ним.

print(ab) 
<generator object <genexpr> at 0x4d7058> 

print(list(ab)) 
[4, 5, 6, 8, 10, 12, 12, 15, 18] 

если вы «были» пытается решить эту проблему с помощью индексов, я бы, вероятно, использовать:

[a[x] * b[y] for x,_a in enumerate(a) for y,_b in enumerate(b)] 

вы также можете сделать забавные вещи, как:

from operator import mul 

a = [1,2,3] 
b = [4,5,6] 

ab = list(map(mul, a,b)) 

print(ab) 

[4, 10, 18] 

если вы использовали :

ab = map(mul, a,b) 

Вы бы создали e объект карты ... который очень похож на <generator>.

print(ab) 
>>> <map object at 0x4d4eb0> 

print(list(ab)) 
>>> [4, 10, 18] 

или если у вас было три списка:

a = [1,2,3] 
b = [4,5,6] 
c = [7,8,9] 

abc = list(map(lambda x,y,z: x * y * z, a,b,c)) 

print(abc) 

[28, 80, 162] 

и если вы действительно хотели, чтобы вы могли сделать:

from itertools import product 
from functools import reduce 
from operator import mul 

a = [1,2,3] 
b = [4,5,6] 

ab = list(map(lambda x: reduce(mul,x), product(a,b))) 
--or-- 
ab = list(map(lambda x: mul(*x), product(a,b))) 

print(ab) 

[4, 5, 6, 8, 10, 12, 12, 15, 18] 
+0

Огромный +1 ... Я не знал, что карта может принимать n параллельных массивов позиционных аргументов. – twneale

+1

Как «un-pythonic» как карта, уменьшить ... есть. Они делают меня счастливым :) – beoliver

+1

Они не совсем отвратительны при правильном использовании, так как есть определенные вещи, которые вы можете сделать с картой и уменьшаете, что не может быть сделано так же легко с другими функциями и языковыми функциями Python. Например, список/генератор/и т. Д. Понимание становится очень громоздким при использовании множества итераций в качестве входных данных. «[P] ловкость превосходит чистоту», в конце концов. – JAB

3

У вас есть многочисленные ошибки в коде и следует прочитать Python tutorial.

for i in a Итерации по элементам a, а не их индексы. Итак, вы хотите i*j, а не a[i]*b[j]. Кроме того, append.multi(y) не подходит для добавления в список, и вы не определяете какую-либо переменную, называемую y, так что непонятно, что вы пытаетесь сделать. Прочтите учебник.

0

for i in a не возвращает индексы, он возвращает значения. Вы должны сделать это:

for i in a: for j in b: multi=i*j ... 
2

Используйте список понимание:

a = [1,2,3] 
b = [4,5,6] 
m = [x * y for x in a for y in b] 
print m 
>>> [4, 5, 6, 8, 10, 12, 12, 15, 18] 
Смежные вопросы