Список Python странным образом преобразуется в массив NumPy

У меня есть питон list:

[[([1, 20230112060000], [10000, 20230112060000]),
  ([1, 20230108060000], [7000, 20230109060000]),
  ([3, 20221229060000], [6929, 20221229060000]),
  ([1, 20221227060000], [3900, 20221227060000]),
  ([1, 20221226060000], [6500, 20221226060000]),
  ([1, 20221221060000], [4400, 20221222060000]),
  ([1, 20221216060000], [3888, 20221216060000]),
  ([1, 20221205060000], [5998, 20221205060000]),
  ([1, 20221128060000], [5000, 20221128060000]),
  ([1, 20221127060000], [5000, 20221127060000]),
  ([1, 20221123060000], [5666, 20221123060000]),
  ([1, 20221122060000], [6000, 20221122060000]),
  ([1, 20221120060000], [4300, 20221120060000]),
  ([1, 20221118060000], [4998, 20221118060000]),
  ([1, 20221028050000], [2700, 20221028050000]),
  ([1, 20221027050000], [5000, 20221027050000]),
  ([1, 20221022050000], [4300, 20221022050000]),
  ([1, 20221019050000], [4498, 20221019050000]),
  ([1, 20221018050000], [3500, 20221018050000]),
  ([2, 20221015050000], [3899, 20221015050000]),
  ([1, 20221011050000], [4500, 20221011050000]),
  ([2, 20221008050000], [4850, 20221008050000]),
  ([2, 20221007050000], [5898, 20221007050000]),
  ([1, 20221004050000], [7499, 20221004050000]),
  ([1, 20221001050000], [3400, 20221001050000]),
...
 [],
 [([2, 20230206060000], [357500, 20230206060000])],
 [([2, 20230206060000], [357500, 20230206060000]),
  ([6, 20230205060000], [353833, 20230205060000])],
 ...]

Но когда я пытаюсь преобразовать его в массив NumPy, происходит что-то странное:

import numpy as np
a = [...] # the above list
b = np.array(a)

b:

array([list([([1, 20230112060000], [10000, 20230112060000]), ([1, 20230108060000], [7000, 20230109060000]), ([3, 20221229060000], [6929, 20221229060000]), ([1, 20221227060000], [3900, 20221227060000]), ([1, 20221226060000], [6500, 20221226060000]), ([1, 20221221060000], [4400, 20221222060000]), ([1, 20221216060000], [3888, 20221216060000]), ([1, 20221205060000], [5998, 20221205060000]), ([1, 20221128060000], [5000, 20221128060000]), ([1, 20221127060000], [5000, 20221127060000]), ([1, 20221123060000], [5666, 20221123060000]), ([1, 20221122060000], [6000, 20221122060000]), ([1, 20221120060000], [4300, 20221120060000]), ([1, 20221118060000], [4998, 20221118060000]), ([1, 20221028050000], [2700, 20221028050000]), ([1, 20221027050000], [5000, 20221027050000]), ([1, 20221022050000], [4300, 20221022050000]), ([1, 20221019050000], [4498, 20221019050000]), ([1, 20221018050000], [3500, 20221018050000]), ([2, 20221015050000], [3899, 20221015050000]), ([1, 20221011050000], [4500, 20221011050000]), ([2, 20221008050000], [4850, 20221008050000]), ([2, 20221007050000], [5898, 20221007050000]), ([1, 20221004050000], [7499, 20221004050000]), ([1, 20221001050000], [3400, 20221001050000]), ([1, 20220928050000], [5000, 20220929050000]), ([1, 20220926050000], [3000, 20220926050000]), ([1, 20220925050000], [4500, 20220925050000]), ([1, 20220922050000], [4000, 20220922050000]), ([1, 20220920050000], [5000, 20220920050000]), ([1, 20220916050000], [8000, 20220916050000]), ([2, 20220915050000], [6625, 20220915050000]), ([2, 20220914050000], [4500, 20220914050000]), ([1, 20220903050000], [10000, 20220903050000]), ([1, 20220821050000], [8600, 20220821050000]), ([2, 20220820050000], [37500, 20220820050000]), ([1, 20220819050000], [30000, 20220819050000]), ([2, 20220818050000], [13999, 20220818050000]), ([1, 20220816050000], [4000, 20220817050000]), ([1, 20220815050000], [4000, 20220815050000])]),
       list([]), list([([1, 20230112060000], [10000, 20230112060000])]),
       ...,
       list([([1, 20230123060000], [5745, 20230123060000]), ([1, 20230105060000], [13000, 20230105060000]), ([1, 20221228060000], [6000, 20221228060000]), ([2, 20221227060000], [6000, 20221227060000]), ([1, 20221222060000], [8571, 20221222060000]), ([1, 20221218060000], [8250, 20221218060000]), ([1, 20221216060000], [8000, 20221216060000]), ([1, 20221213060000], [7500, 20221213060000]), ([1, 20221210060000], [3500, 20221210060000]), ([1, 20221109060000], [6500, 20221109060000])]),
       list([([1, 20230123060000], [5745, 20230123060000]), ([1, 20230105060000], [13000, 20230105060000]), ([1, 20221228060000], [6000, 20221228060000]), ([2, 20221227060000], [6000, 20221227060000]), ([1, 20221222060000], [8571, 20221222060000]), ([1, 20221218060000], [8250, 20221218060000]), ([1, 20221216060000], [8000, 20221216060000]), ([1, 20221213060000], [7500, 20221213060000]), ([1, 20221210060000], [3500, 20221210060000]), ([1, 20221109060000], [6500, 20221109060000]), ([1, 20220909050000], [9999, 20220909050000])]),
       list([([1, 20230123060000], [5745, 20230123060000]), ([1, 20230105060000], [13000, 20230105060000]), ([1, 20221228060000], [6000, 20221228060000]), ([2, 20221227060000], [6000, 20221227060000]), ([1, 20221222060000], [8571, 20221222060000]), ([1, 20221218060000], [8250, 20221218060000]), ([1, 20221216060000], [8000, 20221216060000]), ([1, 20221213060000], [7500, 20221213060000]), ([1, 20221210060000], [3500, 20221210060000]), ([1, 20221109060000], [6500, 20221109060000]), ([1, 20220909050000], [9999, 20220909050000]), ([1, 20220901050000], [8444, 20220901050000])])],
      dtype=object)

По какой-то причине кортежи и списки не конвертируются должным образом. Из-за этого b не работает как обычный массив NumPy, потому что все элементы являются объектами. Я знаю, что могу пройти и скрыть все tuples в lists, но есть ли способ заставить NumPy преобразовать все правильно?

Кстати, под правильным преобразованием я подразумеваю вместо:

array([list([()])])

Он должен быть преобразован как:

array([[[]]])

Отвечает ли это на ваш вопрос? Список списков в массиве numpy

Amin S 13.02.2023 04:21

«По какой-то причине кортежи и списки не преобразуются должным образом». Как вы думаете, что должно получиться вместо этого? Почему? Можете ли вы продемонстрировать проблему с меньшим вводом? Пожалуйста, прочитайте Как спросить и минимальный воспроизводимый пример.

Karl Knechtel 13.02.2023 04:23

Я думаю, проблема может быть в том, что не все ваши списки имеют одинаковый размер, например. np.array([[1, 2], [3, 4]]) в порядке, но np.array([[1, 2], [3, 4, 5]]) вызвал Creating an ndarray from ragged nested sequences предупреждение. Либо отфильтруйте, либо добавьте значение по умолчанию в список, чтобы каждый элемент сначала имел одинаковый размер (возможно, проблема в части list([]))

Wakeme UpNow 13.02.2023 04:28

Ваш ввод кажется неровным. NumPy не создает зубчатые массивы — строгие требования к форме имеют решающее значение для эффективности NumPy.

user2357112 13.02.2023 04:36

О, так мне нужно заполнить отдельные массивы, чтобы они были одинаковой длины?

catasaurus 13.02.2023 04:37

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

user2357112 13.02.2023 04:38

@catasaurus Да, ты должен. Или удалить их из списка. Или, чтобы сократить все остальные... Массив Numpy гиперпрямоугольный (это означает, что они имеют обычный размер во всех измерениях).

chrslg 13.02.2023 04:38

Этот list([]) выделяется как больной палец! Дело не в сочетании кортежей и списков, а в их размере.

hpaulj 13.02.2023 04:57
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
8
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как правильно заметил Wakeme UpNow, ваша проблема в том, что ваши списки имеют разный размер. Ключевой момент, который вы должны понимать при работе с NumPy, заключается в том, что он получает свою производительность, делая некоторые предпосылки о ваших данных, то есть:

    1. это числовое
    1. Это того же типа
    1. Все подмассивы имеют одинаковую длину

Если вы нарушите одну из этих предпосылок, вы автоматически потеряете все выгоды, которые в противном случае вы получили бы от NumPy использования, поскольку оно вернется к чистому pythonic поведению (то есть к dtype=object).

Подробное NumPy обсуждение можно найти здесь.

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

Ваше здоровье

Другие вопросы по теме