Ваш код не работает, потому что он делает это:
Create variable `funcs` and assign it an empty array;
Loop from 0 up until it is less than 3 and assign it to variable `i`;
Push to variable `funcs` next function:
// Only push (save), but don't execute
**Write to console current value of variable `i`;**
// First loop has ended, i = 3;
Loop from 0 up until it is less than 3 and assign it to variable `j`;
Call `j`-th function from variable `funcs`:
**Write to console current value of variable `i`;**
// Ask yourself NOW! What is the value of i?
Теперь вопрос в том, каково значение переменной i
при вызове функции? Поскольку первый цикл создается с условием i < 3
, он немедленно останавливается, когда условие ложно, поэтому оно i = 3
.
Вам нужно понять, что во время создания ваших функций ни один из их кодов не выполняется, он сохраняется только позже. И поэтому, когда они вызываются позже, интерпретатор выполняет их и спрашивает: «Каково текущее значение i
?»
Итак, ваша цель - сначала сохранить значение функции i
для функции и только после этого сохраните функцию до funcs
. Это можно сделать следующим образом:
var funcs = [];
for (var i = 0; i < 3; i++) { // let's create 3 functions
funcs[i] = function(x) { // and store them in funcs
console.log("My value: " + x); // each should log its value.
}.bind(null, i);
}
for (var j = 0; j < 3; j++) {
funcs[j](); // and now let's run each one to see
}
Таким образом, каждая функция будет иметь свою собственную переменную x
, и мы устанавливаем значение x
на значение i
на каждой итерации.
Это только один из нескольких способов решения этой проблемы.
Так как вам нужно сохранить первую ось из выровненных W
и C
, оставив позади последнюю ось с матричным умножением, я бы предложил использовать np.einsum
для очень эффективного подхода, например:
np.einsum('ijk,ik->ij',W,C
)
np.tensordot
или np.dot
не имеет функции для выравнивания осей, и именно здесь np.einsum
улучшается.
Это делается с помощью np.tensordot
ans=np.tensordot(W,C,axes=[2,1])[np.arange(m),:,np.arange(m)]
assert np.all(result==ans)
np.dot
должен быть вашим другом. http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.dot.html