2011-02-11 94 views
5

我不知道它是怎么叫的蟒蛇,我认为它的一对 无论如何,我有一个巨大的numpy的阵列,它的格式是这样numpy的数组转换为对

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

我需要这个numpy的阵列格式是:

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

Nodepairs需要是()之间进行手动建设蟒蛇 我建立一个庞大的神经网络神经网络FFnet,所以我用一个函数来创建数组,但我不明白的()符号

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 
    ... 
    .. 
    . 
+0

感谢您的所有答案;所有这些都是真理,对我来说也是一种学习。 同时我发现FFnet除了[(0,0),(.....] 也接受[[0,0],[1,2]]这样的数组,最重要的是我认为是重塑选项,所以我没有必要改变我以前的代码 – user613326 2011-02-15 05:45:01

+0

感谢您所有的答案;它们都是真理,并且我学会了pywisdom 同时,我发现FFnet也接受[[0 ,0],[1,2]]除了[(0,0),(.....] 最重要的是我认为是重塑选项,所以我没有必要改变我以前的所有代码 – user613326 2011-02-15 05:46:38

回答

6

一种方法是只需将它转换为二维数组NumPy的:

FFnetlayer0 = FFnetlayer0.reshape(-1, 2) 

现在,访问FFnetlayer0[i]一些i会给你两个条目的NumPy的阵列。

+0

这就是我要在代码中使用的东西,所以我将它作为答案投票;所有其他答案在哪里都很好,而且我必须决定什么,我不确定谁在这里最好。对numpy阵列的洞察力其他人在Python数组;我必须感谢你们。 – user613326 2011-02-14 21:27:54

4

那么你的FFnetlayer0不是numpy array,它仍然只是一个python列表。你可以分析它

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

对于更多拉链看到: http://docs.python.org/library/functions.html#zip


注意到,在您创建通过追加numpy的阵列的意见。注意到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告诉蟒对象的内存位置。请注意,这可能不是一个很大的区别,除非你的数组很大并且经常被附加。此外,如果尽可能最好做数组来构建大型数组,而不是逐个元素循环或追加。

+0

你说得对,FFnetlayer0是一个普通的列表;但`numpy.append()`行确实返回numpy数组。 – senderle 2011-02-11 17:28:44

2
a = [ 0, 243, 9, 243, 18, 243] 
zip(a[::2],a[1::2]) 
0

您可以使用numpy records来实现此目的。

看来你的所有数字都在255以下;因此我假设你不需要一个可以处理大于这个数字的数据类型。如果您需要其他数据类型,则可以用appropriate type替换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) 

顺便说一句,你似乎没有被使用在你的代码numpy的阵列;相反,您正在使用函数numpy.append来扩展Python列表。

1

追加到numpy数组时的默认行为是将它们拼合起来。但是,一旦你有了一个2-D numpy数组,你可以追加到它而不需要展开它;你只需要指定轴参数:

>>> 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]]) 

不过,它可能更容易简单地填充数组,然后重塑。

编辑:由于jimbob正确指出,这不是最有效的方式来建立一个大型数组。作为替代,请考虑numpy.fromiter()