// #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;
}
Ваш 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-> 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
и выше.
Хотя ваш вопрос не является дубликатом, см. Также этот .