我需要垂直堆叠numpy数组,这是function_returns_some_np_array的返回值。该函数始终返回相同形状的数组。如果我不检查X是否不为空,我会得到以下错误。
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:
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)))是否总是需要检查数组是否为空,或者是否有一行解决方案来处理此问题?一些内置的东西会很棒的。所以总结一下这个问题。这个操作有没有更短的解决方案?
谢谢
发布于 2021-09-07 11:03:19
你的例子缺少一些上下文,X的迭代堆栈表明它发生在某种循环中?
通常最好避免像这样的迭代堆叠(或附加等),因为它迫使Numpy每次都创建一个新的数组。
如果你的用例看起来像这样:
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次迭代/调用)。
举个例子:
res = []
for _ in range(50):
res.append(function_returns_some_np_array(data))
X = np.vstack(res) 这删除了if-语句,使其更容易阅读,您在开始时只有一个初始化“问题”,而不是需要if-语句的真正决策。
与top相比,它也快了3倍,但这实际上取决于返回的数组的大小与迭代的数量。
https://stackoverflow.com/questions/69086676
复制相似问题