2015-06-09 7 views
4

Я ищу для заполнения массива 900-some by 38 в python. Каждая строка соответствует определенному контуру, и каждый столбец соответствует признаку для этого контура. Я просматриваю каждый контур и вычисляю свойства области для контура, но я не понял наиболее эффективный способ сделать это.Создание больших массивов в Python

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

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

Основы моего кода ниже. Является ли создание массива 1D длиной 34 200 элементов, а затем его наилучшим вариантом?

 cs = find_contours(Image) 
     print len(cs) 
     for c in cs: 

     Area   = moments['m00'] 
     features.append(Area) 
     Perimeter  = cv2.arcLength(c,True) 
    # bounding box: x,y,width,height 
     BoundingBox = cv2.boundingRect(c) 
    # centroid = m10/m00, m01/m00 (x,y) 
     Centroid  = (moments['m10']/moments['m00'],moments['m01']/moments['m00']) 

    # EquivDiameter: diameter of circle with same area as region 
     EquivDiameter = ny.sqrt(4*Area/ny.pi) 
     features.append(EquivDiameter) 
    # Extent: ratio of area of region to area of bounding box 
     Extent  = Area/(BoundingBox[2]*BoundingBox[3]) 


    # CONVEX HULL stuff 
    # convex hull vertices 
     ConvexHull = cv2.convexHull(c) 
     ConvexArea = cv2.contourArea(ConvexHull) 

    # Solidity := Area/ConvexArea 
     Solidity  = Area/ConvexArea 

Поэтому я ищу, чтобы сохранить ценности, такие как площадь, периметр, и т.д. для каждого контура в качестве I контура через них.

+0

Это выглядит как ответ может быть ищет: http://stackoverflow.com/questions/869778/populating-a-list-array-by-index-in-python – Acehilm

+1

@Fappycow: Нету, то OP спрашивает о массивах numpy, поэтому списки, безусловно, являются неправильной вещью здесь ... – burnpanck

+1

Почему приостановлено? Если вы переводите «лучший способ» как «самый эффективный», то это вовсе не мнение, основанное на мнениях. Кроме того, ответ не очевиден для неопытных пользователей. – burnpanck

ответ

0

Одним из вариантов является создание единого списка всех значений, создание массива numpy, а затем изменение размера массива. Так, например, если у вас было три контура с тремя точками данных каждого:

l = [] 
for i in range(9): 
    l.append(calculated value) 
l = np.asarray(l) 
l.reshape(3,3) 

Это позволяет избежать вложенных циклов, но вам может понадобиться, чтобы посмотреть на более быстрых вариантов, если ваш набор данных становится достаточно большим.

Смежные вопросы