0

我想将几个(比如 15 个)形状 (3072,) 的长数组组合成一个形状 (15,3072) 的 np.array。如果找到了解决方案,但是在 for 循环中包含嵌套的 if 子句,这对我来说似乎效率低下。是否有更有效的解决方案来提出必要形状的 numpy 数组(而不是列表)?这是代码:

# Creating sample array
arr1 = np.array([8, 19, 43], dtype=int)

# What I do at the moment (and it works)
arr_out = np.array([])
for i in range(3):
    if i == 0:
        arr_out = np.hstack((arr_out, arr1))
    else:
        arr_out = np.vstack((arr_out, arr1))
        
arr_out # Output is correct shape (Each "new" array gets a new row.)

数组([[8., 19., 43.], [8., 19., 43.], [8., 19., 43.]])

当我使用 np.append 时会发生什么:

# How to do the above without the if loop in the for loop?
arr_out = np.array([])
for i in range(3):
    arr_out = np.append(arr_out, arr1, axis=0)

arr_out # Output is not in correct shape

数组([8., 19., 43., 8., 19., 43., 8., 19., 43.])

您是否看到任何不使用列表(或至少最终没有列表)的情况下获得第一个示例的 numpy.array 形状的有效方法?

4

1 回答 1

0

通过用我需要的正确数量的列初始化数组自己解决了这个arr_out问题(在上面的迷你示例中是三个)。然后您可以摆脱 if 子句并直接执行np.vstack. 但是,当数组有很多列时(在我的实际情况下> 3000),在我看来,摆脱 if 子句的好处是初始化一个大的空数组。因此,当您循环很多次时,摆脱 if 子句只会让您在运行时方面做得更好(在我的情况下是这样,因为我将运行大约 60.000 次)。这是代码:

# Creating sample array
arr1 = np.array([8, 19, 43], dtype=int)

# Solution
arr_out = np.array([0,len(arr1)])
for i in range(3): #I run through the loop a couple of thousand times
    arr_out = np.vstack((arr_out, arr1))
于 2021-03-27T09:47:12.293 回答