>

numpy 의 핵심 개념을 이해하지 못했습니다.  아직.

3 차원 배열을 만들고 함수 호출의 결과로 각 셀을 채우고 싶습니다. 즉, 함수가 다른 인덱스로 여러 번 호출되어 다른 값을 반환합니다.

참고 :이 질문을 작성한 이후로 문서가보다 명확하게 업데이트되었습니다.

0으로 만들거나 빈 값으로 만든 다음 for 루프로 모든 값을 덮어 쓸 수 있지만 함수에서 직접 채우는 것이 더 깔끔해 보입니다.

fromfunction 완벽합니다. 문서를 읽는 중 함수가 호출 된 것처럼 들립니다 셀당 한 번.

그러나 실제로 시도하면 ...

from numpy import *
def sum_of_indices(x, y, z):
    # What type are X, Y and Z ? Expect int or duck-type equivalent.
    # Getting 3 individual arrays
    print "Value of X is:"
    print x
    print "Type of X is:", type(x)
    return x + y + z
a = fromfunction(sum_of_indices, (2, 2, 2))

나는 다음과 같은 것을 얻을 것으로 예상된다 :

Value of X is:
0
Type of X is: int
Value of X is:
1
Type of X is: int

4 번 반복

알겠습니다 :

Value of X is:
[[[ 0.  0.]
  [ 0.  0.]]
 [[ 1.  1.]
  [ 1.  1.]]]
[[[ 0.  0.]
  [ 1.  1.]]
 [[ 0.  0.]
  [ 1.  1.]]]
[[[ 0.  1.]
  [ 0.  1.]]
 [[ 0.  1.]
  [ 0.  1.]]]
Type of X is: <type 'numpy.ndarray'>

함수는 한 번만 호출되며 결과적으로 전체 배열을 반환하는 것 같습니다.

지수 함수에 대한 여러 호출을 기반으로 배열을 채우는 올바른 방법은 무엇입니까?

  • 답변 # 1

    문서는 그런 점에서 오해의 소지가있다. 참고로 f(0,0), f(0,1), f(1,0), f(1,1) 를 수행하는 대신 , numpy는

    f([[0., 0.], [1., 1.]], [[0., 1.], [0., 1.]])
    
    

    약속 된 정수 좌표 대신 ndarray를 사용하는 것은 lambda i: l[i] 와 같은 것을 사용하려고 할 때 매우 실망 스럽습니다. 여기서 l  는 다른 배열 또는 목록입니다 (실제로, 아마도 numpy 에서이 작업을 수행하는 더 좋은 방법이있을 수 있습니다).

    너무 많은 vectorize  함수는 이것을 수정합니다. 당신이있는 곳

    m = fromfunction(f, shape)
    
    

    사용해보십시오

    g = vectorize(f)
    m = fromfunction(g, shape)
    
    

  • 답변 # 2

    확실하지 않았다. 나는 fromfunc 응답을 받고있다  실제로 내 테스트 코드가 시연 한 것처럼 작동합니다. 테스트 코드에서 시연했기 때문에 이미 알고있었습니다.

    내가 찾던 답은 두 부분으로되어있다 :

    <시간>

    와이즈 비즈  문서가 잘못되었습니다. 전체 배열을 한 번에 채우도록 작동합니다.

    참고 :이 질문을 작성한 이후로 문서가보다 명확하게 업데이트되었습니다.

    특히문서에있는이 줄은 잘못되었습니다 (또는 최소한 오도의 소지가 있습니다)

    와이즈 비즈 와이즈 비즈  (2, 2)이면 매개 변수는 (0, 0), (0, 1), (1, 0), (1, 1)입니다.

    아니요. 만약 fromfunc  (즉, 문맥에서

    For example, if 에 대한 두 번째 매개 변수 )는 (2,2)였으며 매개 변수는 '순서대로'가 아니라 유일한 호출입니다.

    shape
    
    

    문서가 업데이트되었으며 현재 더 정확하게 읽습니다 :

    와이즈 비즈

    ( shape 때문에 설명서의 예제에서 파생 된 간단한 예제가 잘못되었을 수 있습니다.  인덱스뿐만 아니라 배열에서도 작동 할 수 있습니다. 이 모호성은 문서가 명확하지 않은 또 다른 이유입니다. 궁극적으로 배열 기반은 아니지만 셀 기반 기능을 사용하고 싶습니다. 각 값은 색인을 기반으로 URL 또는 데이터베이스에서 가져 오거나 사용자의 입력으로 가져올 수도 있습니다.)

    <시간>

    문제로 돌아 가기-요소 당 한 번 호출되는 함수에서 배열을 채우는 방법은 다음과 같습니다.

    기능적인 스타일에서는이 작업을 수행 할 수 없습니다.

    당신은 명령형/반복적 스타일로 할 수 있습니다-즉, 중첩 된 for-loops를 작성하고 색인 길이를 직접 관리하십시오.

    이터레이터로도 할 수 있지만, 이터레이터는 여전히 자체 인덱스를 추적해야합니다.

  • 답변 # 3

    fromfunction 가 무엇인지 오해하고 있다고 생각합니다  그렇습니다.

    (array([[ 0., 0.], [ 1., 1.]]), array([[ 0., 1.], [ 0., 1.]])) 에서  소스 코드.

    The function is called with N parameters, where N is the rank of shape. Each parameter represents the coordinates of the array varying along a specific axis. For example, if shape were (2, 2), then the parameters would be array([[0, 0], [1, 1]]) and array([[0, 1], [0, 1]])

    와이즈 비즈   + 와 상당히 같습니다  각 변수는 fromfunction 입니다 .

    numpy
    
    

  • 답변 # 4

    이로 인해 잘못된 결과가 발생합니까? 와이즈 비즈  예상대로 (그리고 테스트했을 때), 원하는 것을 수행하는 좋은 방법 인 것 같습니다.

    def fromfunction(function, shape, **kwargs):
        dtype = kwargs.pop('dtype', float)
        args = indices(shape, dtype=dtype)
        return function(*args,**kwargs)
    
    

    와이즈 비즈 이후  입력을 위해 배열 인덱스에서 작동합니다. 한 번만 호출하면됩니다. 이 문서는이를 명확하게 설명하지는 않지만 소스 코드의 인덱스 배열에서 함수가 호출되고 있음을 알 수 있습니다 ( indices 에서) ) :

    meshgrid
    
    

    np.arange(x)  각 배열이 해당 인덱스 값을 보유하는 배열 입력에서 호출됩니다. 차원.

    >>> side = np.arange(2)
    >>> side
    array([0, 1])
    >>> x,y,z = np.meshgrid(side,side,side)
    >>> x
    array([[[0, 0],
            [1, 1]],
           [[0, 0],
            [1, 1]]])
    >>> x+y+z #Result of your code.
    array([[[0, 1],
            [1, 2]],
           [[1, 2],
            [2, 3]]])
    
    

    a

  • 이전 amazon web services - S3에 저장된 AWS Athena를 통해 동일한 형식의 JSON 및 CSV 읽기
  • 다음 c++ - vector 를 vector 로 캐스트