Создать матрицу с матрицей с элементами – функцию индексов

Как я могу создать матрицу numpy со своими элементами, являющимися функцией ее индексов? Например, таблица умножения: a[i,j] = i*j

Un-numpy и un-pythonic должны были бы создать массив нулей, а затем выполнить цикл.

Нет сомнения, что это лучший способ сделать это без цикла.

Однако еще лучше было бы создать матрицу сразу.

Заранее благодарим за ваши предложения.

  • Virtualenv и контроль версий версий
  • Очистка потерянных файлов из GridFS
  • Вручную установить цвет точек в легенде
  • Локальная коллекция пакетов Python: лучший способ их импортировать?
  • Вызов внешней команды в Python
  • Как работают поля модели Django?
  • когда итерация списка python является и не является ссылкой
  • Добавить обнаружение столкновения в plattformer в pygame
  • 4 Solutions collect form web for “Создать матрицу с матрицей с элементами – функцию индексов”

    На данный момент я далеко от своего питона, но работает ли это?

     array( [ [ i*j for j in xrange(5)] for i in xrange(5)] ) 

    Вот один из способов сделать это:

     >>> indices = numpy.indices((5, 5)) >>> a = indices[0] * indices[1] >>> a array([[ 0, 0, 0, 0, 0], [ 0, 1, 2, 3, 4], [ 0, 2, 4, 6, 8], [ 0, 3, 6, 9, 12], [ 0, 4, 8, 12, 16]]) 

    Для дальнейшего объяснения numpy.indices((5, 5)) генерирует два массива, содержащие индексы x и y массива 5×5, например:

     >>> numpy.indices((5, 5)) array([[[0, 0, 0, 0, 0], [1, 1, 1, 1, 1], [2, 2, 2, 2, 2], [3, 3, 3, 3, 3], [4, 4, 4, 4, 4]], [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]]) 

    Когда вы умножаете эти два массива, numpy умножает значение двух массивов в каждой позиции и возвращает результат.

    Для умножения

     np.multiply.outer(np.arange(5), np.arange(5)) # a_ij = i * j 

    и в целом

     np.frompyfunc( lambda i, j: f(i, j), 2, 1 ).outer( np.arange(5), np.arange(5), ).astype(np.float64) # a_ij = f(i, j) 

    в основном вы создаете np.ufunc через np.frompyfunc а затем outer с индексами.

    редактировать

    Сравнение скорости между различными решениями.

    Малые матрицы:

     Eyy![1]: %timeit np.multiply.outer(np.arange(5), np.arange(5)) 100000 loops, best of 3: 4.97 µs per loop Eyy![2]: %timeit np.array( [ [ i*j for j in xrange(5)] for i in xrange(5)] ) 100000 loops, best of 3: 5.51 µs per loop Eyy![3]: %timeit indices = np.indices((5, 5)); indices[0] * indices[1] 100000 loops, best of 3: 16.1 µs per loop 

    Большие матрицы:

     Eyy![4]: %timeit np.multiply.outer(np.arange(4096), np.arange(4096)) 10 loops, best of 3: 62.4 ms per loop Eyy![5]: %timeit indices = np.indices((4096, 4096)); indices[0] * indices[1] 10 loops, best of 3: 165 ms per loop Eyy![6]: %timeit np.array( [ [ i*j for j in xrange(4096)] for i in xrange(4096)] ) 1 loops, best of 3: 1.39 s per loop 

    Просто хотелось добавить, что ответ @ Senderle может быть обобщен для любой функции и измерения:

     dims = (3,3,3) #i,j,k ii = np.indices(dims) 

    Затем вы можете вычислить a[i,j,k] = i*j*k как

     a = np.prod(ii,axis=0) 

    или a[i,j,k] = (i-1)*j*k :

     a = (ii[0,...]-1)*ii[1,...]*ii[2,...] 

    и т.д

    Python - лучший язык программирования в мире.