programing

numpy 배열을 통해 반복

minimums 2023. 7. 17. 20:49
반응형

numpy 배열을 통해 반복

이것보다 덜 장황한 대안이 있습니까?

for x in xrange(array.shape[0]):
    for y in xrange(array.shape[1]):
        do_stuff(x, y)

제가 생각해낸 것은 다음과 같습니다.

for x, y in itertools.product(map(xrange, array.shape)):
    do_stuff(x, y)

하나의 움푹 패인 자국을 구하긴 했지만, 여전히 꽤나 추악합니다.

저는 이 가짜 코드처럼 보이는 무언가를 바라고 있습니다.

for x, y in array.indices:
    do_stuff(x, y)

그런 것이 존재합니까?

생각에 당신은 숫자를 찾고 있는 것 같습니다.

>>> a =numpy.array([[1,2],[3,4],[5,6]])
>>> for (x,y), value in numpy.ndenumerate(a):
...  print x,y
... 
0 0
0 1
1 0
1 1
2 0
2 1

공연에 관해서요.그것은 목록 이해보다 조금 느립니다.

X = np.zeros((100, 100, 100))

%timeit list([((i,j,k), X[i,j,k]) for i in range(X.shape[0]) for j in range(X.shape[1]) for k in range(X.shape[2])])
1 loop, best of 3: 376 ms per loop

%timeit list(np.ndenumerate(X))
1 loop, best of 3: 570 ms per loop

성능에 대해 걱정하는 경우 다음과 같은 기능을 구현하는 방법을 검토하여 좀 더 최적화할 수 있습니다.ndenumerate배열로 변환하고 루프하는 두 가지 일을 합니다.어레이가 있다는 것을 알고 있는 경우, 다음을 호출할 수 있습니다..coords플랫 반복기의 속성입니다.

a = X.flat
%timeit list([(a.coords, x) for x in a.flat])
1 loop, best of 3: 305 ms per loop

인덱스만 필요한 경우 다음을 시도할 수 있습니다.

>>> a = numpy.arange(9).reshape(3, 3)
>>> [(x, y) for x, y in numpy.ndindex(a.shape)]
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

센디터

import numpy as np
Y = np.array([3,4,5,6])
for y in np.nditer(Y, op_flags=['readwrite']):
    y += 3

Y == np.array([6, 7, 8, 9])

y = 3작동하지 않음, 사용y *= 0그리고.y += 3대신.

numpy.nditer()를 사용하기 위한 좋은 설명이 여기에 없습니다.그래서, 저는 하나로 갈 것입니다.NumPy v1.21 dev0 설명서에 따르면, NumPy 1.6에 도입된 반복기 개체 엔디터는 하나 이상의 어레이의 모든 요소를 체계적인 방식으로 방문할 수 있는 많은 유연한 방법을 제공합니다.

mean_squared_error를 계산해야 하며 이미 y_predicted를 계산했으며 sklearn에서 사용할 수 있는 보스턴 데이터 세트의 y_actual을 가지고 있습니다.

def cal_mse(y_actual, y_predicted):
    """ this function will return mean squared error
       args:
           y_actual (ndarray): np array containing target variable
           y_predicted (ndarray): np array containing predictions from DecisionTreeRegressor
       returns:
           mse (integer)
    """
    sq_error = 0
    for i in np.nditer(np.arange(y_pred.shape[0])):
        sq_error += (y_actual[i] - y_predicted[i])**2
    mse = 1/y_actual.shape[0] * sq_error
    
    return mse

이것이 도움이 되기를 바랍니다 :).자세한 설명을 위해 방문.

언급URL : https://stackoverflow.com/questions/6967463/iterating-over-a-numpy-array

반응형