在for循环内串联numpy数组

时间:2018-10-17 10:16:02

标签: python arrays loops numpy

我在for循环的每次迭代中创建大小为20x30x30x3的numpy数组。我想将所有这些numpy数组连接成一个更大的数组。如果迭代步骤为100,则我想要的numpy数组应该为2000x30x30x3。我尝试使用列表:

new_one_arr1_list = []
new_one_arr2_list = []
all_arr1 = np.array([])
for item in one_arr1: # 100 iterations
    item = np.reshape(item, (1, 30, 30, 3))
    new_one_arr1 = np.repeat(item, 20, axis=0)

    all_arr1 = np.concatenate(([all_arr1 , new_one_arr1 ]))
    ind = np.random.randint(one_arr2.shape[0], size=(20,))
    new_one_arr2= one_arr1[ind]

    new_one_arr1_list.append(new_one_arr1)
    new_one_arr2_list.append(new_one_arr2)

在每个迭代步骤new_one_arr1new_one_arr2中,它们的大小为20x30x30x3。最后,当我转换new_one_arr1_listnew_one_arr2_list时,其大小为100x20x30x30x3。我怎样才能在一个numpy数组中最后获得2000x30x30x3?

编辑:我尝试使用级联将数组添加到numpy数组all_arr1中,方法是:all_arr1= np.concatenate(([all_arr1, new_one_arr1])),但是我收到了以下消息:

  

ValueError:所有输入数组的维数必须相同

2 个答案:

答案 0 :(得分:1)

为了创建连接并解决错误,我用None初始化了数组,并测试了循环中是否为None。 因此,您不必担心尺寸不匹配。 但是,我为您只描述的数组创建了一些数组,并最终以(400, 30, 30, 3)的形式出现。 从20*20 = 400开始,这适合这里。 希望这对您有所帮助。

new_one_arr1_list = []
new_one_arr2_list = []
one_arr1 = np.ones((20,30,30,3))
one_arr2 = np.ones((20,30,30,3))
all_arr1 = None
count = 0
for item in one_arr1: # 100 iterations
    item = np.reshape(item, (1, 30, 30, 3))
    new_one_arr1 = np.repeat(item, 20, axis=0)

    # print(all_arr1.shape, new_one_arr1.shape)
    if all_arr1 is None:
        all_arr1 = new_one_arr1
    else:
        all_arr1 = np.concatenate(([all_arr1 , new_one_arr1 ]), axis=0)
    ind = np.random.randint(one_arr2.shape[0], size=(20,))
    new_one_arr2= one_arr1[ind]

    new_one_arr1_list.append(new_one_arr1)
    new_one_arr2_list.append(new_one_arr2)
    count += 1
print(count)
all_arr1.shape

答案 1 :(得分:0)

使用文档中给出的np.concatenate操作: https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.concatenate.html

不要在第一次迭代中连接,它会引发尺寸错误,只需在第一次迭代中将其复制即可。对于其余的迭代,请继续串联。

new_one_arr1_list = []
new_one_arr2_list = []
all_arr1 = np.array([])
firstIteration = True
for item in one_arr1: # 100 iterations


    item = np.reshape(item, (1, 30, 30, 3))
    new_one_arr1 = np.repeat(item, 20, axis=0)

    if firstIteration:
        all_arr1 = new_one_arr1
        firstIteration=False
    else:
        all_arr1 = np.concatenate(([all_arr1 , new_one_arr1 ]))
    ind = np.random.randint(one_arr2.shape[0], size=(20,))
    new_one_arr2= one_arr1[ind]

    new_one_arr1_list.append(new_one_arr1)
    new_one_arr2_list.append(new_one_arr2)