numpy TypeError: только целочисленные скалярные массивы могут быть преобразованы в скалярный индекс

i=np.arange(1,4,dtype=np.int)
a=np.arange(9).reshape(3,3)

а также

a
>>>array([[0, 1, 2],
          [3, 4, 5],
          [6, 7, 8]])
a[:,0:1]
>>>array([[0],
          [3],
          [6]])
a[:,0:2]
>>>array([[0, 1],
          [3, 4],
          [6, 7]])
a[:,0:3]
>>>array([[0, 1, 2],
          [3, 4, 5],
          [6, 7, 8]])

Теперь я хочу векторизовать массив, чтобы распечатать их все вместе. я попробую

a[:,0:i]

или же

a[:,0:i[:,None]]

Это дает TypeError: только целочисленные скалярные массивы могут быть преобразованы в скалярный индекс

Ответы

Ответ 1

Короткий ответ:

[a[:,:j] for j in i]

То, что вы пытаетесь сделать, не является векторизуемой операцией. Википедия определяет векторность как пакетную операцию в одном массиве, а не на отдельных скалярах:

В информатике языки программирования массивов (также известные как векторные или многомерные языки) обобщают операции на скалярах, чтобы они прозрачно применялись к векторам, матрицам и многомерным массивам.

...

... операцию, которая работает на целых массивах, можно назвать векторизованной операцией...

В терминах оптимизации уровня ЦП определение векторизации:

"Векторизация" (упрощенная) - это процесс перезаписи цикла, так что вместо обработки одного элемента массива N раз он обрабатывает (скажем) 4 элемента массива одновременно N/4 раза.

Проблема с вашим делом заключается в том, что результат каждой отдельной операции имеет другую форму: (3, 1), (3, 2) и (3, 3). Они не могут сформировать вывод одной векторной операции, потому что вывод должен быть одним непрерывным массивом. Конечно, он может содержать (3, 1), (3, 2) и (3, 3) массивы внутри него (как представления), но это то, что уже a ваш исходный массив.

То, что вы действительно ищете, - это всего лишь одно выражение, которое вычисляет все из них:

[a[:,:j] for j in i]

... но он не векторизован в смысле оптимизации производительности. Под капотом это обычный старым for цикла, который вычисляет каждый деталь по одному.

Ответ 2

попробуйте следующее изменить массив на 1D

a.reshape((1, -1))

Ответ 3

Это может быть не связано с этой конкретной проблемой, но я столкнулся с аналогичной проблемой, где я использовал индексирование NumPy в списке Python и получил точно такое же сообщение об ошибке:

# incorrect
weights = list(range(1, 129)) + list(range(128, 0, -1))
mapped_image = weights[image[:, :, band]] # image.shape = [800, 600, 3]
# TypeError: only integer scalar arrays can be converted to a scalar index

Оказывается, мне нужно было превратить weights, одномерный список Python, в массив NumPy, прежде чем я смог применить многомерное индексирование NumPy. Код ниже работает:

# correct
weights = np.array(list(range(1, 129)) + list(range(128, 0, -1)))
mapped_image = weights[image[:, :, band]] # image.shape = [800, 600, 3]

Ответ 4

Вы можете использовать numpy.ravel для возврата уплощенного массива из n-мерного массива:

>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> a.ravel()
array([0, 1, 2, 3, 4, 5, 6, 7, 8])

Ответ 5

У меня была похожая проблема, и я решил ее с помощью списка... не уверен, поможет ли это или нет

classes = list(unique_labels(y_true, y_pred))

Ответ 6

эта проблема возникает, когда мы используем векторы вместо скаляров, например, в цикле for, диапазон должен быть скалярным, в случае, если вы указали вектор в этом месте, вы получите ошибку. Поэтому, чтобы избежать проблемы, используйте длину вектора, который вы использовали