numpy.ix_

numpy.ix_(*args)

Функция ix_() возвращает открытую координатную сетку созданную из одномерных массивов.

Данная функция принимает N одномерных массивов и возвращает кортеж c теми же N массивами, но каждый из массивов в этом кортеже будет иметь N осей (измерений) среди которых длина только одной не будет равна 1. Таким образом, данная функция позволяет получить N массивов, которые могут быть транслированы по массиву определенной формы (а так же могут быть транслированы друг по другу), который в свою очередь можно считать координатной сеткой N-мерного пространства. Сами по себе эти массивы представляют открытую координатную сетку, т.е. она станет обычной (полной) только после их транслирования друг по другу.

Все вышесказанное для новичков может показаться дикой тарабарщиной (вероятнее всего потому что так и есть), поэтому, если вы сталкиваетесь с чем-то подобным впервые, то лучше сразу перейдите к примерам, так как понять их намного проще.

Параметры:
args - одномерные массивы NumPy или одномерные, массивоподобные объекты.
Тип данных последовательностей может быть только целочисленным или булевым. Булевы массивы выступают в роли масок для соответствующего измерения. Передача булевых массивов равносильна их передаче в функцию np.nonzero().
Возвращает:
tuple - кортеж Python
кортеж с N транслируемыми друг по другу массивами, которые в совокупности являются открытой координатной сеткой N-мерного пространства.
Смотрите так же:
indices, meshgrid, ogrid, mgrid


Примеры

Для начала разберемся с тем, что же все-таки возвращает данная функция. Допустим у нас есть два одномерных массива, которые отмечают на осях x и y определенные точки:

>>> import numpy as np
>>> 
>>> x = np.r_[0:7]
>>> x
array([0, 1, 2, 3, 4, 5, 6])
>>> 
>>> y = np.r_[10:20:3]
>>> y
array([10, 13, 16, 19])

Теперь, представим, что мы бы хотели табулировать некоторую функцию, но для этого нам нужна координатная сетка. Но на самом деле, вместо нее достаточно тех же самых массивов x и y, но только преобразованных так, что бы они могли быть транслированы друг по другу. Именно таким преобразованием и занимается функция ix_():

>>> np.ix_(x, y)
(array([[0],
       [1],
       [2],
       [3],
       [4],
       [5],
       [6]]), array([[10, 13, 16, 19]]))

Как видите оба массива стали двумерными, причем их форма является транслируемой относительно друг друга:

>>> X, Y = np.ix_(x, y)
>>> X.shape, Y.shape
((7, 1), (1, 4))
>>> 
>>> #  np.broadcast_arrays(x, y) - выдаст ошибку
...
>>> np.broadcast_arrays(X, Y)    #  транслирование возможно
[array([[0, 0, 0, 0],
       [1, 1, 1, 1],
       [2, 2, 2, 2],
       ...,
       [4, 4, 4, 4],
       [5, 5, 5, 5],
       [6, 6, 6, 6]]), array([[10, 13, 16, 19],
       [10, 13, 16, 19],
       [10, 13, 16, 19],
       ...,
       [10, 13, 16, 19],
       [10, 13, 16, 19],
       [10, 13, 16, 19]])]

Что в принципе и означает возможность их использования для табулирования какой-нибудь функции от двух переменных:

>>> f = X**2 - Y
>>> f
array([[-10, -13, -16, -19],
       [ -9, -12, -15, -18],
       [ -6,  -9, -12, -15],
       ...,
       [  6,   3,   0,  -3],
       [ 15,  12,   9,   6],
       [ 26,  23,  20,  17]])

При этом, какое бы количество массивов не было передано сix_(), все они будут транслируемы относительно друг друга:

>>> a = np.r_[:10:5]
>>> b = np.r_[:25:7]
>>> c = np.r_[10:50:10]
>>> d = np.r_[10:20:2]
>>> 
>>> np.ix_(a, b, c, d)
(array([[[[0]]],


       [[[5]]]]),

array([[[[ 0]],

        [[ 7]],

        [[14]],

        [[21]]]]), 
        
array([[[[10],
         [20],
         [30],
         [40]]]]),
         
array([[[[10, 12, 14, 16, 18]]]]))
>>> 
>>> A, B, C, D = np.ix_(a, b, c, d)
>>> 
>>> A.shape, B.shape, C.shape, D.shape,
((2, 1, 1, 1), (1, 4, 1, 1), (1, 1, 4, 1), (1, 1, 1, 5))

Помимо одномерных массивов целых чисел функции ix_() могут быть переданы одномерные булевы массивы, что может быть удобным при индексировании массивов:

>>> a = np.arange(12).reshape(3, 4)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> 
>>> ix_grid = np.ix_([True, False, True],
...                  [True, False, True, False])
>>> 
>>> a[ix_grid]
array([[ 0,  2],
       [ 8, 10]])

Можно передавать целочисленные и булевы массивы вместе:

>>> ix_grid = np.ix_([True, False, True], [1, 3])
>>> 
>>> a[ix_grid]
array([[ 1,  3],
       [ 9, 11]])