【问题标题】:Adding results to a numpy array将结果添加到 numpy 数组
【发布时间】:2017-12-27 18:58:27
【问题描述】:

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

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

【问题讨论】:

  • result_array = np.array([result_array, minimum_arrray]) 应该可以工作。 np.vstack 将一个元组作为输入 np.vstack((result_array, minimum_arrray))
  • @Eskapp 我收到此错误NameError: name 'result_array' is not defined 我不知道为什么?

标签: arrays python-3.x numpy binary


【解决方案1】:

您可以按如下方式堆叠 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 数组并在每次迭代中分配其行。但在您的简单情况下,堆叠也可能有效。

【讨论】:

  • 但是,现在建议使用np.stack 而不是vstack,并为轴添加一个额外的参数。 :)
  • @Eskapp:不确定如何循环执行此操作,因为stack 每次都会引入一个新维度。
  • @Falko 这很好用,但是新数组result 的类型是float64 有没有办法让它int64
【解决方案2】:

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

首先编写一个简单的函数,将任意精度的二进制数组转换为整数数组。这些可以通过一个简单的计算来完成,它比字符串转换和转换过程更快、更容易理解。 #这会将二进制数组解释为无符号整数,如果要将二进制数组转换为整数,则必须进行一些修改。 def bin2int(bin_array): 小数=np.zeros(bin_array.shape[0],dtype=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)时一些其他有用函数的示例

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2011-02-10
    相关资源
    最近更新 更多