【问题标题】:Whats the difference between `arr[tuple(seq)]` and `arr[seq]`? Relating to Using a non-tuple sequence for multidimensional indexing is deprecated`arr[tuple(seq)]` 和 `arr[seq]` 有什么区别?不推荐使用与使用非元组序列进行多维索引相关的内容
【发布时间】:2019-10-27 23:47:21
【问题描述】:

我正在使用一个 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 上的其他问题似乎在scipypandas 中遇到了这个错误,大多数人认为错误出现在这些包的特定版本中。我遇到了纯粹在 numpy 中运行的警告。

示例帖子:

FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated use `arr[tuple(seq)]` instead of `arr[seq]`

FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated use `arr[tuple(seq)]`

FutureWarning with distplot in seaborn

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

【问题讨论】:

    标签: numpy numpy-ndarray


    【解决方案1】:

    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)]一样,是两个子数组的元组。

    基本上,他们试图消除由于历史原因而存在的漏洞。我不知道他们是否可以更改对meshgrid 结果的处理,而不会导致进一步的兼容性问题。

    【讨论】:

    • 了解替代方案很有用,谢谢。那么我们是否知道结果会有什么不同(如FutureWarning ...which will result either in an error or a different result 所示)?否则我应该尝试坚持使用元组或解压索引而不是arr[seq]
    • 它可以尝试arr[np.array(idx),...],将meshgrid列表变成一个仅索引第一个维度的数组。
    • 我错过了什么吗? arr[_51]arr[_52]arr[I, J] 给出相同的结果,那么区别在哪里?
    • @Jason,是的,它们产生相同的东西(警告除外)。这就是我的观点。
    猜你喜欢
    • 2019-02-06
    • 2021-03-02
    • 2019-03-06
    • 2021-05-29
    • 1970-01-01
    • 2021-09-16
    • 2019-04-14
    • 2011-07-26
    • 2020-07-10
    相关资源
    最近更新 更多