将结果添加到numpy数组

时间:2017-07-21 16:25:05

标签: arrays python-3.x numpy binary

我正在使用python-3.x,我想创建一个名为result_array的numpy数组,它保存每个循环的二进制结果(minimum_arrray)

# 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]]

2 个答案:

答案 0 :(得分: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数组,并在每次迭代中分配其行。但在简单的情况下,堆叠也可以起作用。

答案 1 :(得分:0)

您的代码效率低下且可以简化。

首先编写一个简单的函数,将任意精度的二进制数组转换为整数数组。这些可以通过简单的计算完成,比字符串转换和转换过程更快,更容易理解。     #这会将二进制数组解释为unsigned int,如果要将二进制数组转换为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)

如果您有任何其他问题,请随时询问。