В чем разница между `arr [tuple (seq)]` и `arr [seq]`?Относительно использования последовательности без кортежей для многомерной индексации не рекомендуется - PullRequest
1 голос
/ 13 июня 2019

Я использую ndarray, чтобы нарезать другой ndarray.Обычно я использую arr[ind_arr].numpy кажется, что это не так и вызывает FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated use arr[tuple(seq)] instead of arr[seq].

В чем разница между arr[tuple(seq)] и arr[seq]?

Другие вопросы по StackOverflow, похоже, сталкиваются с этой ошибкойв scipy и pandas, и большинство людей предлагают, чтобы ошибка была в конкретной версии этих пакетов.Я сталкиваюсь с предупреждением, работающим исключительно в numpy.

Примеры сообщений:

FutureWarning: Использование последовательности без кортежей для многомерной индексации не рекомендуется использовать `arr [tuple (seq)] `вместо` arr [seq] `

FutureWarning: Использование последовательности без кортежей для многомерной индексации не рекомендуется использовать` arr [tuple (seq)] `

FutureWarning с distplot в морской части

MWE, воспроизводящее предупреждение:

import numpy as np

# generate a random 2d array
A = np.random.randint(20, size=(7,7))
print(A, '\n')

# define indices
ind_i = np.array([1, 2, 3])  # along i
ind_j = np.array([5, 6])  # along j

# generate index array using meshgrid
ind_ij = np.meshgrid(ind_i, ind_j, indexing='ij')

B = A[ind_ij]
print(B, '\n')

C = A[tuple(ind_ij)]
print(C, '\n')

# note: both produce the same result

1 Ответ

0 голосов
/ 13 июня 2019

meshgrid возвращает список массивов:

In [50]: np.meshgrid([1,2,3],[4,5],indexing='ij')                                                      
Out[50]: 
[array([[1, 1],
        [2, 2],
        [3, 3]]), array([[4, 5],
        [4, 5],
        [4, 5]])]
In [51]: np.meshgrid([1,2,3],[4,5],indexing='ij',sparse=True)                                          
Out[51]: 
[array([[1],
        [2],
        [3]]), array([[4, 5]])]

ix_ делает то же самое, но возвращает кортеж:

In [52]: np.ix_([1,2,3],[4,5])                                                                         
Out[52]: 
(array([[1],
        [2],
        [3]]), array([[4, 5]]))

np.ogrid также создает список.

In [55]: arr = np.arange(24).reshape(4,6)                                                              

индексирование с помощью кортежа ix:

In [56]: arr[_52]                                                                                      
Out[56]: 
array([[10, 11],
       [16, 17],
       [22, 23]])

индексирование с использованием списка meshgrid:

In [57]: arr[_51]                                                                                      
/usr/local/bin/ipython3:1: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
  #!/usr/bin/python3
Out[57]: 
array([[10, 11],
       [16, 17],
       [22, 23]])

Часто результат meshgridиспользуется с распаковкой:

In [62]: I,J = np.meshgrid([1,2,3],[4,5],indexing='ij',sparse=True)                                    
In [63]: arr[I,J]                                                                                      
Out[63]: 
array([[10, 11],
       [16, 17],
       [22, 23]])

Здесь [I,J] совпадает с [(I,J)], образуя кортеж из 2 подмассивов.

В основном они пытаются удалить существующую лазейкупо историческим причинам.Я не знаю, могут ли они изменить обработку результатов meshgrid, не вызывая дальнейших проблем совместимости.

...