메모리 (행 주요 순서) :numpy는 어떻게 다차원 방송을 구현 했습니까?
[[A(0,0), A(0,1)]
[A(1,0), A(1,1)]]
has this memory layout:
[A(0,0), A(0,1), A(1,0), A(1,1)]
나는 다음과 같은 경우에이 같은 알고리즘의 일을 생각한다.
[[0, 1, 2, 3] [[1]
x
[4, 5, 6, 7]] [10]]
A (2 by 4) B (2 by 1)
Iterate 0th dimensions of A and B simultaneously {
Iterate last dimension of A{
multiply;
}
}
방송 치수가 0 번째 치수 :
방송 치수는 지난 차원이다
[[0, 1, 2, 3]
x [[1,10,100,1000]]
[4, 5, 6, 7]]
A (2 by 4) B (1 by 4)
Iterate 0th dimension of A{
Iterate 1st dimensions of A and B simultaneously{
multiply;
}
}
질문 :
어떻게 최고 곱셈의 어떤 순서로 알고 NumPy와 않습니다 . (순서대로 메모리가 사방에 메모리를 읽는 것보다 더 나은 독서.하지만 어떻게 NumPy와 그림 않았다고?)
배열이있는 경우에 할 NumPy와 것입니다 무엇
두 개 이상의 차원
할 NumPy와 것입니다 무엇
- 방송 차원이 마지막 차원이 아닌 경우? 무슨 일이 일어나고 있는지의
2 추측 :
#include <iostream>
int main(void){
const int nA = 12;
const int nB = 3;
int A[nA];
int B[nB];
for(int i = 0; i != nA; ++i) A[i] = i+1;
for(int i = 0; i != nB; ++i) B[i] = i+1;
//dimension
int dA[] = {2,3,2};
int dB[] = {1,3,1};
int* pA = A;
int* pB = B;
int* pA_end = A + nA;
//is it possible to make the compiler
//generate the iA and sA?
int iB = 0;
int iB_max = 2;
int sB[] = {1,0};
while(pA != pA_end){
std::cout << "*pA, *pB: " << *pA << ", " << *pB <<std::endl;
std::cout << "iB: " << iB <<std::endl;
*(pA) *= *(pB);
++pA;
pB += sB[iB];
++iB;
if (iB == iB_max) {iB = 0; pB = B;}
}
for(pA = A; pA != pA_end; ++pA){
std::cout << *(pA) << ", ";
}
std::cout << std::endl;
}
2 추측이 잘못된 것 같다 ffered 외부 루프는
cython
가 빠르고, 간단c
반복으로이 변환 빠른입니다. numpy는 다중 색인을 사용하는 것 같습니다. – rxu