Python добавить в ndarray

У меня np.ndarray:

[[0 4 0 0] [0 5 8 2] [2 7 3 2]]

Я хочу добавить в позицию 0 другой элемент, чтобы результат выглядел так:

[['cat' 0 4 0 0] ['cat' 0 5 8 2] ['cat' 2 7 3 2]]

Я пробовал np.insert, append, vstack и concatenate, как указано в других сообщениях. Но никто не работает. Я подозреваю, что это потому, что тип моего массива - <class 'numpy.ndarray'>. Я также пробовал преобразовать его в список и добавить или в обычный np.array, но ничего не работает.

Любые идеи?

Редактировать:

Я пытался:

    arr=[np.append('cat',i) for i in my_array]

Это работает, однако результат выглядит так:

[array(['cat' 0 4 0 0], dtype=object), array(['cat' 0 5 8 2], dtype=object), array(['cat' 2 7 3 2], dtype=object)]

numpy массивов, как один тип данных.

Paritosh Singh 30.12.2018 21:22

@ParitoshSingh, но даже добавить int не работает ...

user3755632 30.12.2018 21:24

а зачем это нужно? ваш пример пытается добавить "кота". это не int и не может быть приведено к одному типу.

Paritosh Singh 30.12.2018 21:29

Почему не работает со списками? Вы пробовали [['cat'] + i for i in l]

yatu 30.12.2018 21:30

@ParitoshSingh Я понимаю, что кошка - это строка .. Я только что говорил вам, что я тоже пытался вставить int

user3755632 30.12.2018 21:31

я понимаю. вставка int должна работать нормально.

Paritosh Singh 30.12.2018 21:31

@yatu Я получаю эту ошибку: TypeError: можно только объединить str (не "int") с str

user3755632 30.12.2018 21:37

Вам нужно уделить больше внимания массиву dtype. Оригинал выглядит так, будто у него есть intdtype. Вы не можете добавить к этому строку и все равно получить массив int. Если вы начали со строки dtype, она должна работать. Есть dtype object и составные dtypes, но я не уверен, что вы еще достаточно разбираетесь в numpy, чтобы использовать их с прибылью.

hpaulj 30.12.2018 22:09

Продолжая комментарий @hpaulj, ndarray имеет все те же типы dtypes (float, int или string). Вам понадобится массив записей или структурированный массив, если вы хотите смешивать типы (целые и строковые).

kcw78 31.12.2018 20:50
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
9
1 234
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

ndarray - это контейнер для данных однородный; то есть все элементы должны быть одного типа.

Чтобы выполнить то, что вы пытаетесь сделать с правильным типом, так же просто, как использовать insert. В этом примере я вставляю -1 с индексом 0 вдоль оси столбца:

>>> a
array([[0, 4, 0, 0],
       [0, 5, 8, 2],
       [2, 7, 3, 2]])
>>> np.insert(a, 0, -1, axis=1)
array([[-1,  0,  4,  0,  0],
       [-1,  0,  5,  8,  2],
       [-1,  2,  7,  3,  2]])

@ user3755632 он может выдавать правильный результат, но "работает" здесь неточно; это а) полностью разрушает любую надежду на получение каких-либо преимуществ numpy помимо расширенного индексирования (никакие векторизованные операции не будут работать), и б) чрезвычайно неэффективно, если выполняется более пары раз, потому что изменения формы заставляют полную копию всего массива - списки обычно быстрее.

roganjosh 30.12.2018 22:11

@roganjosh Следует ли мне удалить этот ответ? Я не уверен, что полностью понимаю вашу точку зрения "а)".

cody 30.12.2018 22:20

Совершенно не то, что я предлагаю, извините. Это скорее примечание для OP, что, хотя это дает им желаемый результат, он на самом деле не соответствует тому, для чего предназначен numpy. Они могут захотеть пересмотреть общий подход.

roganjosh 30.12.2018 22:24

Numpy может переносить вычисления прямо в C и использовать векторизацию; это может ускорить определенные вычисления на порядки. Хотя ваш пример полностью числовой, у меня сложилось впечатление (возможно, неправильно), что OP хочет массивы смешанного типа, и векторизация станет невозможной.

roganjosh 30.12.2018 22:26

:) Мой комментарий должен быть сформулирован более четко, я не имел в виду, что ответ был технически неверным, извинения.

roganjosh 30.12.2018 22:31

@ user3755632, любопытно, как вы заставили его работать, добавив строку. Я получаю сообщение об ошибке, если заменяю приведенный выше np.insert на np.insert(a, 0, 'cat', axis=1) (сообщение об ошибке: ValueError: недопустимый литерал для int () с базой 10: 'cat')

kcw78 31.12.2018 20:46

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