簡體   English   中英

python中奇怪的“數組索引太多”錯誤

[英]Weird “too many indices for array” error in python

讓我們創建一個包含10,000個條目的大型np數組'a'

import numpy as np
a = np.arange(0, 10000)

讓我們用'n'索引0-> 9,1-> 10,2-> 11等對數組進行切片。

n = 32
b = list(map(lambda x:np.arange(x, x+10), np.arange(0, n)))
c = a[b]

我得到的奇怪的是,如果n小於32,我得到一個錯誤“IndexError:數組的索引太多了”。 如果n大於或等於32,則代碼完美運行。 無論初始數組的大小或單個切片的大小如何,都會發生錯誤,但始終使用數字32.請注意,如果n == 1,則代碼可以正常工作。

有什么原因造成的? 謝謝。

首先,你不是在切片0-> 9,10-> 19,20-> 29; 你的切片只提前1:0-> 9,1-> 10,11-> 20。 相反,試試這個:

n = 32
size = 10
b = list(map(lambda x:np.arange(x, x+size), np.arange(0, n*size, size)))

接下來,您濫用了索引表示法。 b是一個數組列表,您已經使用整個列表來索引a 比存在於當您索引更多的元素anumpy假定您要作為參考的一個序列的復雜列表,並把它們作為單獨的索引數組,一個a在每個葉元素元素b

然而,一旦你降到極限len(a)然后numpy假設,你想給一個多維片到a :的每一個元素b被作為片成相應尺寸a 由於a只是1維,因此您會收到錯誤消息。 您的代碼將在此模式下運行, n=1 ,但在n=2及更高版本時失敗。

雖然你的問題不重復,但請看這個

你的b是一個數組列表:

In [84]: b = list(map(lambda x:np.arange(x, x+10), np.arange(0, 5)))            
In [85]: b                                                                      
Out[85]: 
[array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
 array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10]),
 array([ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11]),
 array([ 3,  4,  5,  6,  7,  8,  9, 10, 11, 12]),
 array([ 4,  5,  6,  7,  8,  9, 10, 11, 12, 13])]

用作索引時:

In [86]: np.arange(1000)[b]                                                     
/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
---------------------------------------------------------------
IndexError: too many indices for array

A[1,2,3]A[(1,2,3)] - 也就是說,逗號分隔的索引是一個元組,然后傳遞給索引函數。 或者換句話說,多維索引應該是一個元組(包括帶有切片的元組)。

到目前為止, numpy有點草率,並允許我們以相同的方式使用索引列表。 警告告訴我們,開發人員正在收緊這些限制。

該錯誤意味着它正在嘗試將列表中的每個數組解釋為單獨維度的索引。 一個數組最多可以有32個維度。 顯然,對於較長的列表,它不會嘗試將其視為元組,而是創建一個用於索引的二維數組。

我們可以通過多種方式使用b來索引1d數組:

In [87]: np.arange(1000)[np.hstack(b)]                                          
Out[87]: 
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  1,  2,  3,  4,  5,  6,  7,
        8,  9, 10,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11,  3,  4,  5,  6,
        7,  8,  9, 10, 11, 12,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13])

In [89]: np.arange(1000)[np.array(b)]    # or np.vstack(b)                                       
Out[89]: 
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10],
       [ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11],
       [ 3,  4,  5,  6,  7,  8,  9, 10, 11, 12],
       [ 4,  5,  6,  7,  8,  9, 10, 11, 12, 13]])

In [90]: np.arange(1000)[b,]             # 1d tuple containing b                                       
Out[90]: 
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10],
       [ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11],
       [ 3,  4,  5,  6,  7,  8,  9, 10, 11, 12],
       [ 4,  5,  6,  7,  8,  9, 10, 11, 12, 13]])

請注意,如果b是一個參差不齊的列表 - 一個或多個數組較短,則只有hstack版本有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM