2016-10-29 8 views
3

Я изучаю python, и у меня возникает небольшая проблема при работе с объектом. Я попытался найти решение, но это ни к чему не привело, поэтому я спрашиваю вас, ребята.Как преобразовать объект в массив

Я хочу получить первые X столбцов объекта, но я не могу, поскольку он не имеет одинакового размера в каждой строке.

У меня есть этот объект:

array([[45, 45, 45, 50, 51, 50, 50, 50, 51, 50, 52], 
     [45, 45, 45, 50, 51, 50, 50, 50, 51, 50, 51, 52, 55], 
     [45, 45, 45, 50, 51, 50, 52, 50, 50, 50, 51], 
     [50, 51, 52, 55, 50, 52, 50, 50, 50, 51, 50, 51]], dtype=object) 

И я хотел бы получить что-то вроде этого:

array([[45, 45, 45, 50], 
     [45, 45, 45, 50], 
     [45, 45, 45, 50], 
     [50, 51, 52, 55]]) 

Что я могу сделать, чтобы решить эту проблему? Спасибо за вашу помощь

Альваро

+1

У вас есть массив элементов 1d 4 из 'dtype = object'. Каждый элемент представляет собой список. Это в основном то же самое, что и список списков; и обычно лучше рассматривать ее как таковую. Массивная оболочка не добавляет много и может даже замедлить работу. – hpaulj

ответ

3

насчет

import numpy as np 
data = np.array([[45, 45, 45, 50, 51, 50, 50, 50, 51, 50, 52], 
       [45, 45, 45, 50, 51, 50, 50, 50, 51, 50, 51, 52, 55], 
       [45, 45, 45, 50, 51, 50, 52, 50, 50, 50, 51], 
       [50, 51, 52, 55, 50, 52, 50, 50, 50, 51, 50, 51]], dtype=object) 
newData = np.array([d[:4] for d in data]) 
+0

Спасибо, что работает! Как вы думаете, есть ли способ сделать это без необходимости? Например, как функция массива или что-то в этом роде? –

0

Вам может потребоваться более общее решение, где вы можете также specifiy количество строк следующим образом:

import numpy as np 

arr = np.array([[45, 45, 45, 50, 51, 50, 50, 50, 51, 50, 52], 
     [45, 45, 45, 50, 51, 50, 50, 50, 51, 50, 51, 52, 55], 
     [45, 45, 45, 50, 51, 50, 52, 50, 50, 50, 51], 
     [50, 51, 52, 55, 50, 52, 50, 50, 50, 51, 50, 51]], dtype=object) 

def slice_array(arr, num_cols, num_rows=None): 
    if num_rows: 
     return np.array([row[:num_cols] for row in arr[:num_rows]]) 
    return np.array([row[:num_cols] for row in arr]) 

res1 = slice_array(arr, 4, 2) 
res2 = slice_array(arr, 4) # Like in your case 

Результаты:

>>> res1 
array([[45, 45, 45, 50], 
     [45, 45, 45, 50]]) 
>>> res2 
array([[45, 45, 45, 50], 
     [45, 45, 45, 50], 
     [45, 45, 45, 50], 
     [50, 51, 52, 55]]) 
Смежные вопросы