我不确定它是如何在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
...
..
.
答案 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列表。