numpy数组转换为pair

时间:2011-02-11 16:16:01

标签: python arrays numpy

我不确定它是如何在python中调用我认为它是一对 无论如何,我有一个巨大的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需要介于()之间,用于手动构建python的神经网络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
    ...
    ..
    . 

5 个答案:

答案 0 :(得分:6)

一种方法是将其转换为二维NumPy数组:

FFnetlayer0 = FFnetlayer0.reshape(-1, 2)

现在,访问某些FFnetlayer0[i]的{​​{1}}将为您提供包含两个条目的NumPy数组。

答案 1 :(得分: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

有关zip的更多信息,请参阅: 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告诉python对象的内存位置。请注意,这可能不是一个很大的区别,除非您的数组很大且经常附加。另外,如果可能的话,最好做数组数学来构造大型数组,而不是逐个元素地循环或附加。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

附加到numpy数组时的默认行为是展平它们。但是一旦你有一个2维的numpy数组,你就可以附加它而不会弄平它;你只需要指定axis参数:

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

答案 4 :(得分: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列表。