2015-05-18 4 views
-2

Могу ли я использовать numpy для генерации повторяющихся шаблонов индексов, например.Есть ли способ генерации списка индексов с использованием numpy

0, 1, 2, 3, 4, 5, 0, 6, 7, 8, 9, 10, 0, 11, 12, 13, 14, 15

или

0,1,2,1,2,3,4,5,6,5,6,7

есть ли способ в NumPy я могу использовать для создания этих списков между диапазоном?

В настоящее время я делаю это с использованием списков в python, но мне было любопытно, могу ли я использовать numpy для ускорения работы.

Я не уверен, какие методы даже смотреть в отличие от numpy.arange.

Просто для дальнейшего уточнения Я генерирую индексы в треугольники в opengl в различных шаблонах.

так что для черепах в круге у меня есть такой код.

for fan_set in range(0, len(self.vertices)/vertex_length, triangle_count): 
     for i in range(fan_set + 1, fan_set + 8): 
      self.indices.append(fan_set) 
      self.indices.append(i) 
      self.indices.append(i + 1) 
+0

Второй пример не имеет большого смысла, можете ли вы это объяснить? –

+0

Вы столкнулись с необходимостью чего-то более быстрого, чем (х) диапазона? Есть такие вещи, как linspace и mgrid, которые вы, вероятно, могли бы сгибать к своей цели, но я не думаю, что они будут намного быстрее, чем использование xrange. –

+0

Кроме того, если вы можете показать нам, что у вас есть прямо сейчас (вы говорите, что используете в настоящее время списки python), мы могли бы дать вам несколько указателей на ускорение его. –

ответ

0

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

In [860]: np.concatenate((np.zeros((3,1),int),np.arange(1,16).reshape(3,5)),axis=1).ravel() 
Out[860]: 
array([ 0, 1, 2, 3, 4, 5, 0, 6, 7, 8, 9, 10, 0, 11, 12, 13, 14, 
     15]) 

Это потому, что я вижу это 2d повторный образец

array([[ 0, 1, 2, 3, 4, 5], 
     [ 0, 6, 7, 8, 9, 10], 
     [ 0, 11, 12, 13, 14, 15]]) 

Второй образец может быть получен путем ravel этого 2d массива (произведенных путем трансляции 2 массивов):

In [863]: np.array([0,1,4,5])[:,None]+np.arange(3) 
Out[863]: 
array([[0, 1, 2], 
     [1, 2, 3], 
     [4, 5, 6], 
     [5, 6, 7]]) 

Я могу изготовить Первый рисунок с вариацией на 2-м (начальная колонна 0s срывает рисунок)

I=np.array([0,5,10])[:,None]+np.arange(0,6) 
I[:,0]=0 

Я думаю, ваш двойной цикл может быть выражен в виде списка понимания, как

In [872]: np.array([ [k,i,i+1] for k in range(0,1,1) for i in range(k+1,k+8)]).ravel() 
Out[872]: array([0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 5, 0, 5, 6, 0, 6, 7, 0, 7, 8]) 

или без Равель:

array([[0, 1, 2], 
     [0, 2, 3], 
     [0, 3, 4], 
     [0, 4, 5], 
     [0, 5, 6], 
     [0, 6, 7], 
     [0, 7, 8]]) 

хотя я не знаю, какие параметры приводят к вашим примерам.

+0

thats great Я думал, что, возможно, было что-то более простое в numpy, но это то, чем я был после решения numpy. Это также дает мне направление для исследования различных методов. – Oly

0

Я не уверен, что я точно понимаю, что вы имеете в виду, но следующее, что я использую для создания уникальных индексов для трехмерных точек;

def indexate(points): 
    """ 
    Convert a numpy array of points into a list of indices and an array of 
    unique points. 

    Arguments: 
     points: A numpy array of shape (N, 3). 

    Returns: 
     An array of indices and an (M, 3) array of unique points. 
    """ 
    pd = {} 
    indices = [pd.setdefault(tuple(p), len(pd)) for p in points] 
    pt = sorted([(v, k) for k, v in pd.items()], key=lambda x: x[0]) 
    unique = np.array([i[1] for i in pt]) 
    return np.array(indices, np.uint16), unique 

Вы можете найти this code в моем stltools пакете на GitHub.

Это работает так;

In [1]: import numpy as np 

In [2]: points = np.array([[1,0,0], [0,0,1], [1,0,0], [0,1,0]]) 

In [3]: pd = {} 

In [4]: indices = [pd.setdefault(tuple(p), len(pd)) for p in points] 

In [5]: indices 
Out[5]: [0, 1, 0, 2] 

In [6]: pt = sorted([(v, k) for k, v in pd.items()], key=lambda x: x[0]) 

In [7]: pt 
Out[7]: [(0, (1, 0, 0)), (1, (0, 0, 1)), (2, (0, 1, 0))] 

In [8]: unique = np.array([i[1] for i in pt]) 

In [9]: unique 
Out[9]: 
array([[1, 0, 0], 
     [0, 0, 1], 
     [0, 1, 0]]) 

Ключевой момент (если вы простите за каламбур), чтобы использовать кортеж из точки (так как кортеж неизменен и, таким образом, hashable) в качестве ключа в словаре с помощью метода setdefault, в то время как значение dict. Фактически, это первый раз, это точный пункт был замечен.

+0

Это то, что я получаю, но не в последовательном порядке, в повторяющемся порядке, но не один за другим, потому что это повторяет индексы и точки. также вы могли бы, вероятно, нам np.arrange и пропустить генерирование списка, если вы упорядочиваете их таким образом. – Oly

+0

@ О, извините, но я не могу понять ваш комментарий. Эти коды возвращают список * уникальных * точек и массив индексов всех точек в массив уникальных точек. –

+0

Смит мой плохой Я не совсем понял это, я нахожу его немного запутанным, потому что он использует кортежи и массивы dicts, хороший пример, но не совсем то, что я искал. – Oly

0

Я не 100% уверен, что это то, что вы после этого, я думаю, что вы можете достичь этого, используя пару range значений и приращение n раз 3 (разрыв между каждой группой), а затем использовать numpy.concatenate конкатенировать окончательный массив , как это:

import numpy as np 

def gen_list(n): 
    return np.concatenate([np.array(range(i, i+3) + range(i+1, i+4)) + i*3 
          for i in xrange(n)]) 

Использование:

gen_list(2) 
Out[16]: array([0, 1, 2, 1, 2, 3, 4, 5, 6, 5, 6, 7]) 

gen_list(3) 
Out[17]: 
array([ 0, 1, 2, 1, 2, 3, 4, 5, 6, 5, 6, 7, 8, 9, 10, 9, 10, 
     11]) 

list(gen_list(2)) 
Out[18]: [0, 1, 2, 1, 2, 3, 4, 5, 6, 5, 6, 7] 

в моем примере я использую только n, как, сколько групп вы хотите создать, вы можете изменить в соответствии с вашим треугольным-ишем ТРЕБОВАНИЯ ц.

+0

спасибо, например, за его интересный способ сделать это, у меня будет игра с ним и заглянуть в конкатенацию немного больше, поскольку я не знаю много об этом методе. – Oly

+0

@ О, да, есть игра, и я надеюсь, что это поможет, «numpy.concatenate» в основном с объединением последовательности массивов вместе. – Anzel