2017-07-21 122 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)工作时,其他一些有用的功能示例

随意问,如果您有任何进一步的问题。