【问题标题】:How to create numpy array of other numpy arrays with iteration? [closed]如何通过迭代创建其他 numpy 数组的 numpy 数组? [关闭]
【发布时间】:2020-01-27 02:50:18
【问题描述】:

我正在尝试创建一个 numpy 数组,其中每个元素都是一个 (48,48) 形状的 numpy 数组,本质上是一个大列表,我可以在其中迭代并每次检索不同的 48x48 数组。

for i in range(1):
    new_image = np.fromstring(train_np[i][1],dtype=int,sep=" ")
    new_image = new_image.reshape(48,48) #create the new 48x48 correctly

    image_train = np.stack([image_train,new_image]) #this line only works once

当 range 为 1 时(只运行一次),堆栈返回 (2, 48 48) 的预期结果形状。运行不止一次,结果

ValueError: all input arrays must have the same shape

在这种情况下,有没有比 np.stack 更好的操作?我想迭代并看到形状变成 (2,48,48) -> (3,48,48) -> (4,48,48) ... 等等。

【问题讨论】:

  • 为什么不预先分配一个大数组并在每个循环中填充一部分呢?或者,如果您必须使用np.stack,那么将所有数组附加到常规python列表中,然后最后将它们全部连接在一起可能会更快。
  • np.concatenate 允许您指定要连接的轴,但同样,预分配可能更快。
  • np.stack 沿新轴加入形状相同的数组列表。它并不意味着迭代使用。 concatenate/stack 系列中的任何一个都不应被迭代使用。使用这些时要密切注意尺寸。
  • 听起来你需要一个 numpy 数组的列表,而不是一个 numpy 数组的 numpy 数组。你能澄清一下吗?

标签: python arrays numpy multidimensional-array


【解决方案1】:

numpy 针对大型并行计算进行了优化。它在设计上没有非常灵活的数据形状,所以如果你不能硬编码你的数据的形状,你通常最好使用列表(这是灵活的)然后在最后调用numpy来堆叠它们.

image_train = []

for i in range(1):
    new_image = np.fromstring(train_np[i][1],dtype=int,sep=" ")
    new_image = new_image.reshape(48,48) 
    image_train.append(new_image) 

image_train = np.stack(image_train)

也就是说,您可以为此使用np.concatenate,但这会非常缓慢且糟糕的做法。

【讨论】:

  • 这最终比连接快得多,并得到了我需要的形状。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 2014-08-29
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多