, 시퀀스 a[n]
로 시작, 어떤 루프에 대한이 나오는 것은 다음 순서 b[n]
입니다 :
b[n] = a[n] + a[n-1] + 2*a[n-2] + 4*a[n-3] + ... + 2**(n-2)*a[0] =
a[n] + c[n-1]
내가 정의하고있다 :
c[n-1] = a[n-1] + 2*a[n-2] + 4*a[n-3] + ... + 2**(n-2)*a[0]
이 마지막 표현을 염두에두고, 이중 루프를 벡터화하는 방법이 있습니다. 그러나 매우 큰 요인 (2**(n-2)
)에 유의하십시오.이 요소를 통해 시퀀스의 항목을 곱해야합니다. 시퀀스에 양수 및 음수 용어가있는 경우이를 취소하고 합리적인 숫자를 반환 할 수 있습니다. 그러나 1000 개 이상의 양수 요소가 배열되어 있다면 numpy dtype을 오버플로 할 것입니다. 이하 30 개 항목의 짧은 시퀀스 그래서
아마도 당신이 int64
년대를 사용하여 강제로하는 경우, 다음이 루프에 대한보다 빠르게 작동 60 :
def evolving_cumsum(arr):
arr = np.array(arr) # makes a copy of the data
pows = 2**np.arange(len(arr))[::-1]
c = np.cumsum(arr*pows)
c /= pows
arr[1:] += c[:-1]
return arr
>>> a = np.arange(10)
>>> evolving_cumsum(a)
array([ 0, 1, 3, 7, 15, 31, 63, 127, 255, 511])
>>> for i in range(len(a)):
... for k in range(i):
... a[i] += a[k]
...
>>> a
array([ 0, 1, 3, 7, 15, 31, 63, 127, 255, 511])
을하지만, 일반적으로 당신이가는 두렵다 루프를 유지해야합니다.
입력과 원하는 출력을 보여주는 작은 2 차원 예제를 제공 할 수 있습니까? –
2d의 경우에 제공 한 예제가 손상되었습니다. 'axis '는 2 차원 배열의 경우 1보다 클 수 없습니다. –