Странно & ldquo; слишком много индексов для массива & rdquo; ошибка в питоне

// #define _WIN32_WINNT 0x0500     // windows >= 2000 
#include <windows.h> 
#include <iostream>

using namespace std; 

void pos(short C, short R)
{
    COORD xy ;
    xy.X = C ;
    xy.Y = R ;
    SetConsoleCursorPosition( 
    GetStdHandle(STD_OUTPUT_HANDLE), xy);
}
void cls( )
{
    pos(0,0);
    for(int j=0;j<100;j++)
    cout << string(100, ' ');
    pos(0,0);
} 

int main( void )
{
    // write somthing and wait 
    for(int j=0;j<100;j++)
    cout << string(10, 'a');
    cout << "\n\npress any key to cls... ";
    cin.get();

    // clean the screen
    cls();

    return 0;
}
3
задан Maurice Abou Jaoude 28 February 2019 в 17:18
поделиться

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 версия работает.

0
ответ дан hpaulj 28 February 2019 в 17:18
поделиться

Прежде всего, вы не нарезаете 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. Когда вы проиндексировали больше элементов, чем существует в a, numpy предполагает, что вы хотите, чтобы сложный список был взят как последовательность ссылок, и использует их как отдельные индексные массивы, по одному элементу a на элемент листа в b .

Однако, как только вы опускаетесь ниже предела len(a), тогда numpy предполагают, что вы пытаетесь добавить многомерный срез в a: каждый элемент из b берется как срез в соответствующий размер a. Поскольку a является только одномерным, вы получите сообщение об ошибке. Ваш код будет работать в этом режиме с n=1, но не с n=2 и выше.

Хотя ваш вопрос не является дубликатом, см. Также этот .

0
ответ дан Prune 28 February 2019 в 17:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: