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