Самый быстрый способ создать массив из фрейма данных pandas с несколькими значениями (~ 500 000) - PullRequest
0 голосов
/ 29 мая 2019

У меня есть фрейм данных, содержащий столбец 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...