У меня есть ndarray в файле npz, и я пытаюсь вставить числа в индекс 0, а вставленные числа должны увеличиваться на 1. Ниже мой массив
data = [[[3.56, 7.94, 1.78], [8.23, 1.25, 4.80], [0.51, 8.23, 5.67], [9.56, 7.94, 2.78], [5.23, 7.25, 0.80],...]]
И полученный ndarray должен понравиться
data = [[[0, 3.56, 7.94, 1.78], [1, 8.23, 1.25, 4.80], [2, 0.51, 8.23, 5.67], [3, 9.56, 7.94, 2.78], [4, 5.23, 7.25, 0.80],...]]
Я новичок в этой области, поэтому мне нужна помощь в решении этой проблемы.
Более того, я попробовал это решение, но оно для 1D-массива.
Мой пример кода
import numpy as np
a = np.load('abc.npz')['data']
b = a.insert(a, 0+1) # I'm confused here
np.savez('new.npz', data=b)
Ищу некоторые предложения
Да так же, как я показал приведенный массив.
Для этого вам нужно использовать семейство операций numpy.stack
Какова форма вашего массива?
@DaniMesejo Форма массива (1, 5, 3)
, но после вставки элемента в начало каждого подмассива она должна быть (1, 5, 4)
Ты должен сделать:
import numpy as np
data = np.array([[[3.56, 7.94, 1.78], [8.23, 1.25, 4.80], [0.51, 8.23, 5.67], [9.56, 7.94, 2.78], [5.23, 7.25, 0.80]]])
res = np.insert(data, 0, np.arange(data.shape[1]), axis=2)
print(res)
Выход
[[[0. 3.56 7.94 1.78]
[1. 8.23 1.25 4.8 ]
[2. 0.51 8.23 5.67]
[3. 9.56 7.94 2.78]
[4. 5.23 7.25 0.8 ]]]
Из документации, на вставка:
Вставьте значения вдоль данной оси перед заданными индексами.
Итак, в основном вам нужно указать массив (data
), индексы (0
), значения для вставки (np.arange(data.shape[1])
) и ось.
Спасибо за решение, это решение может работать, но оно дает числа с плавающей запятой (0., 1., 2.,,,,) Что, если нам нужны только целые числа? Я имею в виду, что вставленные числа должны быть целыми числами.
@Erric Вы не можете иметь целые числа и числа с плавающей запятой в одном и том же массиве, другие элементы являются числами с плавающей запятой. В массивах numpy все элементы должны иметь один и тот же тип. Вы можете попробовать использовать объект dtype, но я не рекомендую.
Так что нет возможности добавить в качестве индексации или, может быть, мы можем написать новый файл в json?
Что вы подразумеваете под «добавить как индексацию», зачем вам это нужно, почему бы просто не использовать индексы, уже определенные для массивов?
На самом деле мне нужны целые числа.
Если вам нужны целочисленные индексы, просто обратитесь к размеру массива, как предложил Дани Месехо: (np.arange(data.shape[1])) Если вы сохраните его в массиве, тип данных будет одинаковым для всех чисел.
Я решил свою проблему. Мне помог Дани Месехо, и я позаимствовал у него некоторые идеи.
Ниже приведено решение
data = data.tolist()
for index, d in enumerate(data[:]): # slicing
d.insert(0, index) # insert numbers in 0 index of every list.
Идея заключалась в том, чтобы преобразовать ndarray в список, а затем мы можем сохранить его в npz или json после сериализации.
Итак, вы хотите добавить новый номер в начало каждого подмассива?