2017-07-21 118 views
0

我使用python-3.x中,我想創建一個numpy的陣列稱爲result_array從每個迴路保持二進制結果(minimum_arrray)添加結果到numpy的陣列

# The code: 
import random 
import numpy as np 
np.set_printoptions(threshold=np.nan) 
i = 0 
ii= 0 
e = 2 
y = 2 
x = 2 
bin_arrray_size = 5 
# result_array = np.ndarray(shape=(), dtype=int) 
# result_array = np.ndarray(shape=(), dtype=int) 
for ii in range (e): 
    bin_arrray = np.random.randint (2, size=(bin_arrray_size, y*x)) 
    print ("bin_arrray:" '\n', bin_arrray) 

    flot= np.zeros ((bin_arrray_size, 1)) 
    for i in range (bin_arrray_size): 
     X = bin_arrray[i] 

     decimal=int(''.join(map(str,X[:].tolist())), 2) 
     flot[i] = (decimal * 2.324) 

#  print ("flot:" '\n', flot) 
    for flot in np.nditer(flot, flags=['external_loop','buffered'], order='F'): 
     print (" the flot :" '\n', flot) 
    minimum_arrray = bin_arrray[flot.argpartition(0)[:1]] 

    print ("Minimum_arrray:" '\n', minimum_arrray) 
# result_array = np.vstack (result_array, minimum_arrray) 

print ("bin_arrray type:" '\n',type(bin_arrray)) 
print("bin_arrray shape:" '\n', bin_arrray.shape) 
print ("flot type:" '\n', type(flot)) 
print("flot shape:" '\n', flot.shape) 
print ("minimum_arrray type:" '\n', type(minimum_arrray)) 
print("minimum_arrray shape:" '\n', minimum_arrray.shape) 

########## the Result ####### 
bin_arrray: 
[[1 0 0 0] 
[0 0 0 1] 
[0 1 0 0] 
[0 1 0 1] 
[1 0 1 1]] 
the flot : 
[ 18.592 2.324 9.296 11.62 25.564] 
Minimum_arrray: 
[[0 0 0 1]]   ################ First result 
bin_arrray: 
[[0 1 0 0] 
[0 1 0 1] 
[0 0 0 1] 
[1 0 0 1] 
[1 0 0 0]] 
the flot : 
[ 9.296 11.62 2.324 20.916 18.592] 
Minimum_arrray: 
[[0 0 0 1]]   ################ Second Result 
bin_arrray type: 
<class 'numpy.ndarray'> 
bin_arrray shape: 
(5, 4) 
flot type: 
<class 'numpy.ndarray'> 
flot shape: 
(5,) 
minimum_arrray type: 
<class 'numpy.ndarray'> 
minimum_arrray shape: 
(1, 4) 

我已經試過這以前生產循環:

result_array = np.random.random((2,4)) 

result_array = np.ndarray(shape=(), dtype=int) 
循環

result_array = np.vstack (result_array, minimum_arrray) 

但他們沒有工作

我想看到一個名爲(result_array)新的數組什麼後

,並期待這樣的:

result_array: 
    [[0 0 0 1] 
    [0 0 0 1]] 
+0

'result_array = np。數組([result_array,minimum_arrray])'應該工作。 'np.vstack'需要一個元組作爲輸入'np.vstack((result_array,minimum_arrray))' – Eskapp

+0

@Eskapp我得到這個錯誤'NameError:name'result_array'沒有定義'我不知道爲什麼? – azeez

回答

0

您可以按如下方式堆疊numpy數組:

result = np.zeros((0, 5)) 
for i in range(3): 
    array = np.random.rand(1, 5) 
    result = np.vstack((result, array)) 

現在result是:

array([[ 0.23537172, 0.71615064, 0.04694777, 0.76896748, 0.34270846], 
     [ 0.90591311, 0.90446305, 0.31865153, 0.79437811, 0.29033377], 
     [ 0.2967733 , 0.01044752, 0.43947452, 0.10285084, 0.29054507]]) 

的缺陷是調用vstack使用多個參數,而不是一個元組(如Eskapp提到)。

編輯:在效率(也許還有可讀性)方面,您最好構建一個大的3x5 result數組,並在每次迭代中分配它的行。但在你的簡單情況下,堆疊也可能起作用。

+0

但是,現在建議使用'np.stack'而不是'vstack'來爲軸添加一個額外的參數。 :) – Eskapp

+0

@Eskapp:不知道如何在循環中做到這一點,因爲'stack'每次都會引入一個新維度。 – Falko

+0

@Falko這個效果很好,但新數組'result'的類型是'float64'有沒有什麼辦法可以使它成爲'int64' – azeez

0

您的代碼效率低下,可以簡化。

首先編寫一個簡單的函數,將任意精度的二進制數組轉換爲一個int數組。這些可以做一個簡單的計算,比字符串轉換和轉換過程快很多,也更容易理解。 #這將解釋二進制數組爲無符號整數,如果你想將你的二進制數組轉換爲一個整型,你必須做一些修改。 DEF bin2int(bin_array): 小數= np.zeros(bin_array.shape [0],D型細胞= np.int) N = bin_array.shape [1]

for i in range(0,n): 
     decimal+=bin_array[:,n-i-1]*2**i 

    return decimal 

我們的主要部分。你可以使用vstack來組合數組,但是在每次迭代中,這兩個數組都會被複制,這很慢。如果性能有任何問題,請勿在for循環中使用數組堆棧。只有Python列表可以被有效地擴展,而不是numpy數組。

result_array=np.zeros((e,y*x),dtype=np.uint8) 
for ii in range (e): 
    bin_array = np.random.randint (2, size=(bin_array_size, y*x)) 

    decimal=bin2int(bin_array) 
    flot=decimal*2.324 #I don't know why you need this multiplication 

    result_array[ii,:]=bin_array[np.argmin(flot),:] 

print(result_array) 

的二進制數據(numpy.packbits,numpy.unpackbits)工作時,其他一些有用的功能示例

隨意問,如果您有任何進一步的問題。