将列表转换为某个确定大小的np数组

时间:2018-03-02 17:38:15

标签: python python-3.x numpy

假设我有np array这样[366, 731, 48813, 151, 5607, 45568, 24681, 1642, 48814] (我知道它的列表,例如) 如何将其转换为某个最大大小的np array,其中后面的位只是零?  事情是我有这样的列表,我想使用np.append()

[366, 731, 48813, 151, 5607, 45568, 24681, 1642, 48814]
[]
[2325, 148, 211, 37, 24203, 12, 7332, 1415, 196, 141, 41, 4598, 29, 4147, 2231, 8954, 8938, 44, 27993, 5714, 10282, 7858, 785, 21925, 26456, 22217, 5212, 4017]
[]
[8932, 48815, 1415, 3430, 29, 180, 37, 4425, 2983, 639, 25, 633, 9167, 6154, 29, 1720, 577, 34017, 48816]
[]
您可以看到的

具有不同的大小,并忽略空列表

1 个答案:

答案 0 :(得分:0)

这是numpy避免append的一种有效方法:

def sizer(arr, n):
    out = np.zeros(n)
    out[:len(arr)] = arr
    return out

A = [366, 731, 48813, 151, 5607, 45568, 24681, 1642, 48814]

sizer(np.array(A), 14)

# array([   366.,    731.,  48813.,    151.,   5607.,  45568.,  24681.,
#          1642.,  48814.,      0.,      0.,      0.,      0.,      0.])

将多个数组堆叠到一个数组中:

A = [366, 731, 48813, 151, 5607, 45568, 24681, 1642, 48814]
B = [23, 452, 53, 23412, 3124, 1234]
C = [452, 4654, 5476, 547654, 7654, 567, 324, 5436]
D = []

lst = [A, B, C, D]

np.vstack(sizer(np.array(i), max(map(len, lst))) for i in lst if i)

<强>解释

  • 使用generator expression从lst构建可迭代的数组。
  • max(map(len, lst))计算lst
  • 中的最大列表大小
  • sizer()将每个数组的大小调整为此最大大小。
  • np.vstack将一个iterable垂直堆叠到numpy数组中。
  • if i确保您只包含非空列表。

<强>结果

array([[  3.66000000e+02,   7.31000000e+02,   4.88130000e+04,
          1.51000000e+02,   5.60700000e+03,   4.55680000e+04,
          2.46810000e+04,   1.64200000e+03,   4.88140000e+04],
       [  2.30000000e+01,   4.52000000e+02,   5.30000000e+01,
          2.34120000e+04,   3.12400000e+03,   1.23400000e+03,
          0.00000000e+00,   0.00000000e+00,   0.00000000e+00],
       [  4.52000000e+02,   4.65400000e+03,   5.47600000e+03,
          5.47654000e+05,   7.65400000e+03,   5.67000000e+02,
          3.24000000e+02,   5.43600000e+03,   0.00000000e+00]])