Причины и решения распространенной ошибки NumPy

Вот различные ситуации, в которых вы можете столкнуться с этой ошибкой:

Список как элемент целочисленного массива
Многомерный массив с разной размерностью
Вижу ошибку в Pandas из-за задания элемента списком (любой последовательностью)
Вижу ошибку в Sklearn из-за «рваных вложенных последовательностей»
Вывод: 2 причины и 2 решения ошибки

Список как элемент целочисленного массива

import numpy as np
arr = np.array([1, [2, 3]], dtype=int)

Он говорит просто: элемент массива integer не может быть списком.

Мы говорим, что это целочисленный массив.

Это означает, что каждый отдельный элемент этого массива должен быть целым числом.

Тем не менее, наш второй элемент — это список.

Проблема в том, чтобы сказать, что это целочисленный массив.

Если мы перестанем использовать ключевое слово «int», ничего не изменится.

arr = np.array([1, [2, 3]])

Теперь у нас есть VisibleDeprecationWarning.

В нем говорится, что NumPy больше не поддерживает неоднородные вложенные последовательности.

Надо сказать, это массив формы 2*3 или 4*4 или 2*3*5 и т.д.

Я имею в виду форма должна быть четкой из нашего списка, который записан в функции np.array().

Если это неясно, NumPy предполагает, что этот массив не может быть определен с известными типами, поэтому это может быть только массив объектов.

Чтобы не видеть это предупреждение, нам в основном нужно указать тип как объект.

arr = np.array([1, [2, 3]], dtype=object)

За исключением предупреждения, нет никакой разницы между этим кодом и приведенным выше.

Давайте посмотрим на наш массив и его форму.

print(arr)
print(arr.shape)

Этот массив содержит 2 элемента в одном измерении. Первый элемент — это целое число, а второй — список.

Таким образом, это может быть не массив целых чисел, а массив объектов.

print('arr[0]: ', arr[0])
print('arr[1]: ', arr[1])
print('arr[1][0]: ', arr[1][0])
print('arr[1][1]: ', arr[1][1])

Вы видите, что, поскольку мы можем получить первый и второй элемент массива, мы также можем получить элементы внутреннего списка.

Многомерный массив с различной длиной измерения

arr = np.array([[1, 2, 3], [4, 5]], dtype = int)

Логика та же.

Мы не можем определить этот массив с любой формой целых чисел. Это 2*3 или 3*2 или 2*2 + 1?

Он снова состоит из неоднородных вложенных последовательностей.

arr = np.array([[1, 2, 3], [4, 5]])

Итак, решение снова с типом объекта.

arr = np.array([[1, 2, 3], [4, 5]], dtype = object)
print(arr)
print(arr.shape)
print('arr[0]: ', arr[0])
print('arr[1]: ', arr[1])
print('arr[0][0]: ', arr[0][0])
print('arr[0][0]: ', arr[0][1])
print('arr[0][0]: ', arr[0][2])
print('arr[0][0]: ', arr[1][0])
print('arr[1][0]: ', arr[1][1])

Предыдущий был массивом объектов с 2 элементами, и это в точности то же самое, что и предыдущий массив с 2 объектными элементами.

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

Видя ошибку в Pandas из-за установки элемента со списком (любая последовательность)

Вот когда мы видим ту же ошибку в Pandas.

import pandas as pd
df = pd.DataFrame([[1,3],[2,4]], columns = ['Numbers1', 'Numbers2'])
df

Если мы попытаемся установить элемент со списком, появится ошибка.

Возьмите элемент с индексом 0, 1.

print(type(df.iloc[0,1]))
df.iloc[0,1]

Итак, это целочисленный элемент со значением 3.

Теперь давайте попробуем заменить его списком.

df.iloc[0, 1] = [5]

Логика опять та же.

Целое число нельзя заменить списком (любой последовательностью).

Действительно, последовательность не может быть заменена 2D-последовательностью, и если вы попытаетесь, вы получите ту же ошибку.

print(type(df.iloc[0]))
df.iloc[0]

На этот раз мы попытаемся установить 2d-список для серии Pandas.

Прежде чем сделать это, давайте посмотрим, чтобы настроить список на серию Pandas, нет проблем.

df.iloc[0] = [5]
df

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

df.iloc[0] = [7, 8]
df

Тем не менее, если этот список станет 2d, появится ошибка.

df.iloc[0] = [[7, 8]]

Видя ошибку в Sklearn из-за «рваных вложенных последовательностей»

Чтобы сделать пример, я использовал KMeans of Sklearn (всего 4 строки).

Вам не нужно ничего знать о KMeans.

from sklearn.cluster import KMeans
X = np.array([[1, 2], [1, 4], [1]])
kmeans = KMeans(n_clusters=2, random_state=0)
kmeans.fit(X)

Я разделил ошибку на 2 скриншота.

В первом вы видите такое же предупреждениеиз-за проблемы с неравномерной вложенной последовательностью.

Однако это предупреждение говорит только о том, что тип нашего массива — это объект, и что не проблема продолжить выполнение кода.

Тем не менее, когда пришло время использовать этот массив, появляется ошибка.

Вывод: 2 причины и 2 решения ошибки

Вот 2 основные причины появления ошибки.

  1. Форма вашего многомерного массива не является регулярной (не что-то вроде 2 * 2 или 5 * 3).
  2. Вы пытаетесь установить один элемент (с типом int или string) со списком (или любой последовательностью).

Для вашей проблемы есть 2 решения.

  1. Установите тип массива в качестве объекта, если это вас устраивает.
  2. Убедитесь, что ваш массив имеет правильную форму.

Запланируйте сеанс DDIChat в разделе Наука о данных / AI / ML / DL:



Подайте заявку на участие в программе DDIChat Expert здесь.
Работайте с DDI: https://datadriveninvestor.com/collaborate
Подпишитесь на DDIntel здесь.