簡體   English   中英

numpy數組轉換為pair

[英]numpy array conversion to pairs

我不確定它是如何在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 for 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
    ...
    ..
    . 

一種方法是將其轉換為二維NumPy數組:

FFnetlayer0 = FFnetlayer0.reshape(-1, 2)

現在,為某些i訪問FFnetlayer0[i]會給你一個帶有兩個條目的NumPy數組。

那么你的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對象的內存位置。 請注意,這可能不是一個很大的區別,除非您的數組很大且經常附加。 另外,如果可能的話,最好做數組數學來構造大型數組,而不是逐個元素地循環或追加。

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

附加到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()

您可以使用numpy記錄來實現此目的。

看來你的所有數字都低於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)

順便說一句,你似乎沒有在你的代碼中使用numpy數組; 相反,您正在使用函數numpy.append來擴展Python列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM