首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Numpy vstack (如果不为空

Numpy vstack (如果不为空
EN

Stack Overflow用户
提问于 2021-09-07 10:38:44
回答 1查看 40关注 0票数 0

我需要垂直堆叠numpy数组,这是function_returns_some_np_array的返回值。该函数始终返回相同形状的数组。如果我不检查X是否不为空,我会得到以下错误。

代码语言:javascript
复制
ValueError: all the input array dimensions for the concatenation axis must match exactly, but along dimension 1, the array at index 0 has size 0 and the array at index 1 has size 10

代码包含check:

代码语言:javascript
复制
    X = np.empty(0)
    if X.size == 0:
         X = function_returns_some_np_array(data)
    else:
         X = np.vstack((X, function_returns_some_np_array(data)))

是否总是需要检查数组是否为空,或者是否有一行解决方案来处理此问题?一些内置的东西会很棒的。所以总结一下这个问题。这个操作有没有更短的解决方案?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2021-09-07 11:03:19

你的例子缺少一些上下文,X的迭代堆栈表明它发生在某种循环中?

通常最好避免像这样的迭代堆叠(或附加等),因为它迫使Numpy每次都创建一个新的数组。

如果你的用例看起来像这样:

代码语言:javascript
复制
func = lambda x: np.random.randn(x)
data = 10000

X = None

for _ in range(50):

    if X is None:
         X = func(data)
    else:
         X = np.vstack((X, func(data)))

我会简单地将中间结果收集到一个列表中,最后只堆叠一次。但这假设您在计算中不需要中间堆栈。如果你这样做了,最初预分配" final“数组,并插入函数的结果可能会有所帮助,但这需要知道最终的大小(n次迭代/调用)。

举个例子:

代码语言:javascript
复制
res = []
for _ in range(50):
    res.append(function_returns_some_np_array(data))

X = np.vstack(res)    

这删除了if-语句,使其更容易阅读,您在开始时只有一个初始化“问题”,而不是需要if-语句的真正决策。

与top相比,它也快了3倍,但这实际上取决于返回的数组的大小与迭代的数量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69086676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档