【问题标题】:numpy multidimensional indexing :use np array and list give different resultsnumpy 多维索引:使用 np 数组和列表给出不同的结果
【发布时间】:2020-06-05 03:04:49
【问题描述】:

为什么 b1 b2 给出不同的结果,但 b0 ,b1,b3 给出相同的结果。并获得一个
“FutureWarning:不推荐使用非元组序列进行多维索引;使用arr[tuple(seq)] 而不是arr[seq]。将来这将被解释为数组索引arr[np.array(seq)],这将导致错误或结果不同。”

a = np.array([[6, 7], [8, 9]])
print(a.shape)
print(a)
print()

b0 = a[[0, 0]]
print('b0')
print(b0.shape)
print(b0)
print()

b1 = a[[[0, 0]]]
print('b1')
print(b1.shape)
print(b1)
print()

b2 = a[np.array([[0, 0]])]
print('b2')
print(b2.shape)
print(b2)
print()

b3= a[np.array([0, 0])]
print('b3')
print(b3.shape)
print(b3)

(2, 2) [[6 7] [8 9]]

b0 (2, 2) [[6 7] [6 7]]

b1 (2, 2) [[6 7] [6 7]]

b2 (1, 2, 2) [[[6 7] [6 7]]]

b3 (2, 2) [[6 7] [6 7]]

【问题讨论】:

    标签: numpy numpy-ndarray array-broadcasting numpy-slicing


    【解决方案1】:

    作为历史问题

    b1 = a[[[0, 0]]]
    

    被/被评估为

    b1 = a[([0, 0],)]
    b1 = a[[0, 0]]
    

    警告告诉我们正在纠正这个异常。

    a[i,j] 这样的索引实际上是a[(i,j)],将一个元组传递给getitem 方法。由于过去各种包方式的合并,在某些情况下,列表的解释方式相同。你找到了。

    未来的警告告诉我们,进行高级索引的最干净、最清晰的方法是使用元组和数组。使用列表时存在并且在一定程度上仍然存在歧义。

    这在 1.15.0 发行说明弃用中有所描述,

    Multidimensional indexing with anything but a tuple is deprecated. This means that 
    the index list in ind = [slice(None), 0]; arr[ind] should be changed to a tuple, 
    e.g., ind = [slice(None), 0]; arr[tuple(ind)] or arr[(slice(None), 0)]. 
    That change is necessary to avoid ambiguity in expressions such as 
    arr[[[0, 1], [0, 1]]],  interpreted as arr[array([0, 1]), array([0, 1])], 
    that will be interpreted as arr[array([[0, 1], [0, 1]])] in the future.
    

    所以将来 b1 的行为会像 b2,但现在它就像 b0。

    【讨论】:

    • 感谢有用的答案,但为什么 a[[0, 0]] 不会被解释为 a[(0, 0)]?
    • 由于解释在于编译代码,我不能确切地说出原因。正如注释所示,从以前的包(例如numeric)继承了一些歧义,他们正在尝试清理。但弃用是一个缓慢的过程。除非您试图理解旧代码,否则破译这些旧模式几乎没有价值。
    猜你喜欢
    • 2018-02-17
    • 2018-08-06
    • 1970-01-01
    • 2012-06-02
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    相关资源
    最近更新 更多