[英]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.