Эффективно поверните множество точек с набором матриц вращения в numpy [duplicate]

Ваш код не работает, потому что он делает это:

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 на каждой итерации.

Это только один из нескольких способов решения этой проблемы.

2
задан Divakar 10 June 2016 в 05:01
поделиться

3 ответа

Так как вам нужно сохранить первую ось из выровненных W и C, оставив позади последнюю ось с матричным умножением, я бы предложил использовать np.einsum для очень эффективного подхода, например:

np.einsum('ijk,ik->ij',W,C)

np.tensordot или np.dot не имеет функции для выравнивания осей, и именно здесь np.einsum улучшается.

1
ответ дан Divakar 25 August 2018 в 10:58
поделиться

Это делается с помощью np.tensordot

ans=np.tensordot(W,C,axes=[2,1])[np.arange(m),:,np.arange(m)]
assert np.all(result==ans)
0
ответ дан Aditya369 25 August 2018 в 10:58
поделиться

np.dot должен быть вашим другом. http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.dot.html

0
ответ дан Julien 25 August 2018 в 10:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: