【问题标题】:Lists inside big numpy arrays大型 numpy 数组中的列表
【发布时间】:2018-08-17 03:37:53
【问题描述】:

我想使用大型 Numpy 数组的某些部分。然而,Python 一直在抱怨,因为数组的这一小部分实际上并不是一个 Numpy 数组,而是一个列表。所以我调查了一下,发现 Numpy 实际上在大 Numpy 数组中存储了多个列表。这只发生在 Numpy 数组具有一定大小时。所以,我的问题是:

  • numpy 为什么要这样做?
  • 有没有办法防止这种情况,因此只有一个大的 Numpy 数组?
  • 在 Numpy 开始执行此操作后,阈值大小是多少?

这里有两个不同的 Numpy 数组来澄清我的问题。第一个是标准的 Numpy 数组,第二个采用上面解释的内部多个列表的行为。

bigger_array = np.array([
    [[[0.5, 0.05, 0.05, 0.05, 0.0, 0.0, 0.0, 0.0], [0.05, 0.5, 0.05, 0.05, 0.0, 0.0, 0.0, 0.0],
      [0.05, 0.05, 0.5, 0.05, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.05, 0.5, 0.05, 0.05, 0.0, 0.0],
      [0.0, 0.0, 0.05, 0.05, 0.5, 0.05, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.05, 0.5, 0.05, 0.05],
      [0.0, 0.0, 0.0, 0.0, 0.05, 0.05, 0.5, 0.05], [0.0, 0.0, 0.0, 0.0, 0.05, 0.05, 0.05, 0.5]],
     [[0.5, 0.05, 0.05, 0.05, 0.0, 0.0, 0.0, 0.0], [0.05, 0.5, 0.05, 0.05, 0.0, 0.0, 0.0, 0.0],
      [0.05, 0.05, 0.5, 0.05, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.05, 0.5, 0.05, 0.05, 0.0, 0.0],
      [0.0, 0.0, 0.05, 0.05, 0.5, 0.05, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.05, 0.5, 0.05, 0.05],
      [0.0, 0.0, 0.0, 0.0, 0.05, 0.05, 0.5, 0.05], [0.0, 0.0, 0.0, 0.0, 0.05, 0.05, 0.05, 0.5]]],

    [[[0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125],
      [0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125],
      [0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125],
      [0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125],
      [0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125],
      [0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125]],
     [[0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125],
      [0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125],
      [0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125],
      [0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125],
      [0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125],
      [0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125]]],

    [[[0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125],
      [0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125],
      [0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125],
      [0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125],
      [0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125],
      [0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125]],
     [[0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125],
      [0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125],
      [0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125],
      [0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125],
      [0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125],
      [0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125]]]
])


smaller-array = np.array([
    [[[0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05], [0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05],
      [0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05], [0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05]],

     [[0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05], [0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05],
      [0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05], [0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05]]],

    [[[0.5, 0.5, 0.5, 0.5, 0.05, 0.05, 0.05, 0.05], [0.5, 0.5, 0.5, 0.5, 0.05, 0.05, 0.05, 0.05],
      [0.5, 0.5, 0.5, 0.5, 0.05, 0.05, 0.05, 0.05], [0.5, 0.5, 0.5, 0.5, 0.05, 0.05, 0.05, 0.05]],
     [[0.5, 0.5, 0.5, 0.5, 0.05, 0.05, 0.05, 0.05], [0.5, 0.5, 0.5, 0.5, 0.05, 0.05, 0.05, 0.05],
      [0.5, 0.5, 0.5, 0.5, 0.05, 0.05, 0.05, 0.05], [0.5, 0.5, 0.5, 0.5, 0.05, 0.05, 0.05, 0.05]]],

    [[[0.5, 0.5, 0.5, 0.5, 0.05, 0.05, 0.05, 0.05], [0.5, 0.5, 0.5, 0.5, 0.05, 0.05, 0.05, 0.05],
      [0.5, 0.5, 0.5, 0.5, 0.05, 0.05, 0.05, 0.05], [0.5, 0.5, 0.5, 0.5, 0.05, 0.05, 0.05, 0.05]],
     [[0.5, 0.5, 0.5, 0.5, 0.05, 0.05, 0.05, 0.05], [0.5, 0.5, 0.5, 0.5, 0.05, 0.05, 0.05, 0.05],
      [0.5, 0.5, 0.5, 0.5, 0.05, 0.05, 0.05, 0.05], [0.5, 0.5, 0.5, 0.5, 0.05, 0.05, 0.05, 0.05]]]
])

print(type(bigger_array[0][0]))
print(type(smaller_array[0][0]))

【问题讨论】:

  • 这不是整体大小的问题。重要的是列表的大小。如果它们不同,您将使用列表数组,而不是多维数组。检查dtype。在分手的情况下它将是object

标签: python arrays list numpy


【解决方案1】:

构成bigger_array 的列表的子元素大小不同。如果你解决了这个问题,那么 numpy 将返回一个数组。

print([len(x) for y in bigger_array for x in y])  # [8, 8, 6, 6, 6, 6]

如果你需要在一个numpy数组中存储不同大小的序列,你可以创建一个最大大小的空数组然后填充它:

big_array = np.empty(2, 4)
big_array[0] = [1, 2, 3, 4]
big_array[1, :-1] = [1, 2, 3]

您只需要记住哪些元素尚未设置。

这样做的一种方法是保留一个布尔掩码数组,告诉您元素是否已设置。

mask = np.ones_like(big_array, dtype=bool)
mask[-1, -1] = False
mask

返回

array([[ True,  True,  True,  True],
       [ True,  True,  True, False]])

【讨论】:

  • 谢谢,好像我错过了!如果他们在大型 numpy 数组中查找列表会很奇怪..
猜你喜欢
  • 1970-01-01
  • 2017-04-24
  • 2022-01-25
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 2012-05-07
相关资源
最近更新 更多