У меня 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)]
@ParitoshSingh, но даже добавить int не работает ...
а зачем это нужно? ваш пример пытается добавить "кота". это не int и не может быть приведено к одному типу.
Почему не работает со списками? Вы пробовали [['cat'] + i for i in l]
@ParitoshSingh Я понимаю, что кошка - это строка .. Я только что говорил вам, что я тоже пытался вставить int
я понимаю. вставка int должна работать нормально.
@yatu Я получаю эту ошибку: TypeError: можно только объединить str (не "int") с str
Вам нужно уделить больше внимания массиву dtype. Оригинал выглядит так, будто у него есть intdtype. Вы не можете добавить к этому строку и все равно получить массив int. Если вы начали со строки dtype, она должна работать. Есть dtype object и составные dtypes, но я не уверен, что вы еще достаточно разбираетесь в numpy, чтобы использовать их с прибылью.
Продолжая комментарий @hpaulj, ndarray имеет все те же типы dtypes (float, int или string). Вам понадобится массив записей или структурированный массив, если вы хотите смешивать типы (целые и строковые).






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 Следует ли мне удалить этот ответ? Я не уверен, что полностью понимаю вашу точку зрения "а)".
Совершенно не то, что я предлагаю, извините. Это скорее примечание для OP, что, хотя это дает им желаемый результат, он на самом деле не соответствует тому, для чего предназначен numpy. Они могут захотеть пересмотреть общий подход.
Numpy может переносить вычисления прямо в C и использовать векторизацию; это может ускорить определенные вычисления на порядки. Хотя ваш пример полностью числовой, у меня сложилось впечатление (возможно, неправильно), что OP хочет массивы смешанного типа, и векторизация станет невозможной.
:) Мой комментарий должен быть сформулирован более четко, я не имел в виду, что ответ был технически неверным, извинения.
@ user3755632, любопытно, как вы заставили его работать, добавив строку. Я получаю сообщение об ошибке, если заменяю приведенный выше np.insert на np.insert(a, 0, 'cat', axis=1) (сообщение об ошибке: ValueError: недопустимый литерал для int () с базой 10: 'cat')
numpy массивов, как один тип данных.