numpy数组转换为对

5 投票
5 回答
6067 浏览
提问于 2025-04-16 11:39

我不太确定在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需要用( )括起来,这样我才能手动构建一个神经网络FFnet在Python中。

我正在构建一个很大的神经网络,所以我使用一个函数来创建这个数组,但我没有得到( )这个符号。

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 个回答

2

在编程中,有时候我们会遇到一些问题,可能会让我们感到困惑。比如,有人可能会问,为什么在某些情况下,代码的执行结果和我们预期的不一样。这种情况可能是因为我们对代码的理解不够深入,或者是对某些概念的掌握还不够。

在这种情况下,最好的办法就是仔细阅读相关的文档和资料,了解每一行代码的作用,以及它们是如何相互影响的。这样,我们就能更好地理解代码的运行机制,从而解决问题。

另外,和其他程序员交流也是一个很好的方法。通过讨论,我们可以获得不同的视角,可能会发现自己之前没有想到的解决方案。

总之,遇到问题时,不要急于求成,慢慢来,仔细分析,最终一定能找到答案。

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

你的 FFnetlayer0 其实不是一个 numpy 数组,它仍然只是一个 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,可以把这两个列表合并在一起,使用 zip 函数:

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


在评论中注意到你是通过 append 创建 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 对象在内存中的位置。注意,除非你的数组很大并且经常需要添加元素,否则这可能没有太大区别。而且,如果可能的话,最好通过数组运算来构建大数组,而不是一个个元素地用循环或 append。

7

一种方法就是把它转换成一个二维的NumPy数组:

FFnetlayer0 = FFnetlayer0.reshape(-1, 2)

现在,访问 FFnetlayer0[i] 这个地方,给定一个 i 值,会得到一个包含两个元素的NumPy数组。

撰写回答