У меня есть фрейм данных, содержащий столбец vector
, содержащий около 500 000 строк вектора массива.Я пытаюсь выгрузить содержимое этого столбца в двухмерный массив, но я не знаю самый быстрый способ сделать это.
Это формат массива, который я пытаюсь сделатьполучить ([1, 2], [3, 4]
и [5, 6]
- массив, содержащийся в моем фрейме данных):
array([[1, 2],
[3, 4],
[5, 6]])
Я пытался to_numpy
, as_matrix
и .values
, но это дает мне одномерный массив, который нечто я ищу:
array([array([1, 2]),
array([3, 4]),
array([5, 6])])
Единственные методы, которые дали мне желаемый результат, это np.asarray()
и np.array()
, но они занимают слишком много времени в моем случае.
То, что мне нужно, - это тот же массив, который я получаю, используя методы массива (vector1,2 и 8), но быстрее, если это возможно, потому что это занимает слишком много времени, когда у нас много данных.
Спасибо за вашу помощь!
edit : Вот моя функция, которая выполняет следующее: она принимает в параметре информационный кадр, который содержит два столбца: id и векторы, которые являются серией объектов массива.
id vectors
1 array([1,2,3], dtype='float32')
2 array([3,4,5], dtype='float32')
3 array([6,7,8], dtype='float32')
[11530 строк x 2 столбца]
Что я хочу сделать с этой функцией, так это выгрузить содержимое идентификатора столбца в список, который является быстрым и простым, и содержимое столбцавекторы в массив.Поэтому я хочу двумерный массив векторов массивов.
def filter_df(df, request):
start = time.time()
filtered_df = df
ids = filtered_df['id'].tolist()
filtered_df_vectors = filtered_df['vectors'].tolist()
vectors9 = np.array(filtered_df['vectors'].tolist())
vectors1 = np.asarray(filtered_df_vectors)
vectors2 = np.array([f for f in filtered_df_vectors],dtype=np.float32)
vectors3 = filtered_df['vectors'].as_matrix()
vectors4 = filtered_df['vectors'].to_numpy()
vectors5 = filtered_df['vectors'].values
vectors6 = filtered_df.iloc[:,-1].values
vectors8 = np.array(filtered_df['vectors'].values.tolist())
vectors9 = np.array(filtered_df['vectors'].tolist())
filter_duration= time.time()-start
logger.info(f"duration: {filter_duration}s")
return ids,vectors2,filter_duration
Я не могу скопировать и вставить точный вывод, который он возвращает мне для полученных массивов, потому что он будет нечитаем для вас, поэтому я просто покажу дватип массива, который я получаю с помощью нескольких методов, которые я тестировал.
Для векторов 1, 2, 8 и 9, где я использую числовые методы, я получаю этот формат, который я ищу, но он требует двухмного времени (около 0,7 секунды, что слишком медленно для моего случая).Я не буду копировать вставлять точный массив, который я получаю, потому что он будет нечитаемым для вас.Знайте только, что [1,2,3] представляют Вот то, что я получаю:
array([[1,2,3],
[4,5,6],
[7,8,9]], dtype=float32)
ndim : 2
dtype('float32')
shape : (11530, 300)
size : 3459000
Для векторов 3, 4, 5 и 6, где я не использую никаких беспорядочных методов, таких как pandas, to_numpy или as_matrix быстры (~0,05 с), но возвращает мне с той же записью массив этой формы:
array([array([1,2,3], dtype=float32),
array([4,5,6], dtype=float32),
array([7,8,9], dtype=float32)], dtype=object)
ndim : 1
dtype('O')
shape : (11530,)
size : 11530
Я не понимаю, почему он не дает мне тот же массив, что дает мне метод numpy.