Доступ к двумерному индексу элемента при запуске над ним функции применения в pandas / numpy? - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь перебрать массив в numpy и , применяя функцию к каждому элементу, используя некоторые вычисления для индекса . Итак, у меня есть код, который выглядит примерно так:

# f takes in a matrix element and returns some calculation based on the
# element's 2D index i,j
def f(elt, i,j):

      return elt*i + elt*j

# create a 2x3 matrix, A
A = np.array([[1,2,3]
              [4,5,6]])


# Transform A by applying the function `f` over every element.
A_1 = applyFunction(f, A)


print(A_1)
# A_1 should now be a matrix that is transformed:
# [[0  2  6]
   [4 10 18]

Это очень легко сделать с помощью цикла for, но моя матрица настолько велика, что в этом случае это неэффективно. Я пытаюсь использовать встроенные методы Numpy, такие как apply или apply_along_axis

Я также думал о преобразовании матрицы в DataFrame pandas, а затем, возможно, используя имена столбцов и строк в качестве индексов ... но я не знаю, как получить доступ к этому при вызове функции apply_along_axis.

Любая помощь будет оценена. Спасибо!

1 Ответ

0 голосов
/ 30 октября 2018
def f(elt, i,j):
      return (i,j)

A = [[1,2,3],
     [4,5,6]]

In [306]: [[f(None,i,j) for j in range(len(A[0]))] for i in range(len(A))] 
Out[306]: [[(0, 0), (0, 1), (0, 2)], [(1, 0), (1, 1), (1, 2)]]

Решение с массивом, возможно, с примерно такой же скоростью:

In [309]: np.frompyfunc(f,3,1)(None, [[0],[1]],[0,1,2])
Out[309]: 
array([[(0, 0), (0, 1), (0, 2)],
       [(1, 0), (1, 1), (1, 2)]], dtype=object)
In [310]: _.shape
Out[310]: (2, 3)

Самый быстрый и тупой подход, но не использует вашу f функцию:

In [312]: I,J = np.meshgrid(range(2),range(3),indexing='ij')
In [313]: I
Out[313]: 
array([[0, 0, 0],
       [1, 1, 1]])
In [314]: J
Out[314]: 
array([[0, 1, 2],
       [0, 1, 2]])
In [315]: np.stack((I,J), axis=2)
Out[315]: 
array([[[0, 0],
        [0, 1],
        [0, 2]],

       [[1, 0],
        [1, 1],
        [1, 2]]])
In [316]: _.shape
Out[316]: (2, 3, 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...