преобразование массива в пары - PullRequest
5 голосов
/ 11 февраля 2011

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

FFnetlayer0 =   [ 0,  243,    9,  243,   18,  243,    4,  244,   13,  244, ....etc.]

Мне нужен этот формат массива:

FFnetlayer0 =   [ (0,  243),    (9,  243),   (18,  243),    (4,  244),   (13,  244), .....]

Для создания вручную нейронной сети FFnet для python необходимо создать Nodepairs между (). Я строю огромную нейронную сеть, поэтому я использую функцию для создания массива, но я не получаю символы ()в комплекте

conec =[]
for i in range (3):
    conec = numpy.append(conec,[(i,243),(i+9,243),(i+18,243)])
    d = 4
    conec = numpy.append(conec,[(i+d,244),(i+9+d,244),(i+18+d,244)])
    d = 7
    ...
    ..
    . 

Ответы [ 5 ]

6 голосов
/ 11 февраля 2011

Один из способов - просто преобразовать его в двумерный массив NumPy:

FFnetlayer0 = FFnetlayer0.reshape(-1, 2)

Теперь доступ к FFnetlayer0[i] для некоторых i даст вам массив NumPy с двумя записями.

4 голосов
/ 11 февраля 2011

Ну, ваш FFnetlayer0 - это не numpy array, он все еще просто список питонов.Вы можете нарезать его

from numpy import array
FFnetlayer = [0,243, 9,243, 18,243]
first_array = array(FFnetlayer[0::2]) # array([0,9,18])
second_array = array(FFnetlayer[1::2]) # array([243,243,243])

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

Вы также можете сжатьдва списка вместе, если вам не нужно было использовать их в numpy как:

list_of_tuples = zip(FFnetlayer0[0::2], FFnetlayer0[1::2]) # [(0,243), (9,243), (18,243)]
array_of_list_of_tuples = array(list_of_tuples) # array([[0,243],[9,243],[18,243]])

Подробнее о расширенных срезах (или шагах) см .: http://docs.python.org/release/2.3/whatsnew/section-slices.html

Подробнее о zipсм .: http://docs.python.org/library/functions.html#zip


Заметил в комментариях, что вы создали массив numpy с помощью append.Отмечено, что numpy.append не добавляется на месте, поэтому не является эффективным способом расширения длинных массивов.

Например,

ff_list = [(0,243), (9,243)]
orig_id = id(ff_list)
for i in range(1000):
    ff_list.append((i,243))
    assert(orig_id == id(ff_list)) # Assertion is always True
ff_array = numpy.array(ff_list) # This will copy the list into an array; but does this only once rather than N times.

, тогда как

ff_array = numpy.array([(0,243), (9,243)])
last_id = id(ff_array)
for i in range(1000):
    ff_array = numpy.append(ff_array, (i,243))
    assert(last_id != id(ff_array)) # Assertion is True as array is always different.
    last_id = id(ff_array)

id указывает место в памяти объекта Python.Обратите внимание, что это не может быть большой разницей, если ваши массивы большие и часто добавляются.Также, если это вообще возможно, лучше всего делать математику массива для создания больших массивов, а не поэлементно для циклов или добавления.

2 голосов
/ 11 февраля 2011
a = [ 0,  243,    9,  243,   18,  243]
zip(a[::2],a[1::2])
1 голос
/ 11 февраля 2011

Поведение по умолчанию при добавлении к пустым массивам - их выравнивание.Но как только у вас есть двумерный массив, вы можете добавить его, не выравнивая;вам просто нужно указать аргумент оси:

>>> conec = []
>>> for i in range(3):
...     conec = numpy.append(conec,[(i,243),(i+9,243),(i+18,243)])
...     conec = conec.reshape(-1, 2)
...     d = 4
...     conec = numpy.append(conec,[(i+d,244),(i+9+d,244),(i+18+d,244)], axis=0)
... 
>>> conec
array([[  0,   0], [  0, 243], [  9, 243], [ 18, 243], [  4, 244],
       [ 13, 244], [ 22, 244], [  1, 243], [ 10, 243], [ 19, 243],
       [  5, 244], [ 14, 244], [ 23, 244], [  2, 243], [ 11, 243],
       [ 20, 243], [  6, 244], [ 15, 244], [ 24, 244]])

Тем не менее, может быть проще просто заполнить массив и затем изменить его форму.t самый эффективный способ построить большой массив.В качестве альтернативы рассмотрим numpy.fromiter()

0 голосов
/ 11 февраля 2011

Вы можете добиться этого, используя numpy records .

Кажется, что все ваши номера меньше 255;поэтому я предполагаю, что вам не понадобится тип данных, который может обрабатывать числа больше этого.Если вам требуется другой тип данных, вы можете заменить np.int8 на соответствующий тип .

import numpy as np

structure_type = np.dtype([('field1', np.int8), ('field2', np.int8)])
values = np.array([(0, 243), (9, 243), (18, 243)], dtype=structure_type)
print "Entire array:", values
print "First field only:", values['field1']
print "Second element:", values[1]

Вывод:

Entire array: [(0, 243) (9, 243) (18, 243)]
First field only: [  0   9  18]
Second element: (9, 243)

В качестве отступления вы не делаетепохоже, что в вашем коде используются массивы numy;скорее, вы используете функцию numpy.append для расширения списка Python.

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