numpy vstack空初始化

时间:2014-12-04 20:17:00

标签: python numpy

我已经删除了图像数据,现在我希望将其拆分为训练和测试集。 但是,如何初始化一个空的numpy数组,以便我可以开始vstacking?

我的简化代码如下所示:

#k-fold the data
kf = cross_validation.KFold(n, n_folds=2)
fold = 0
for train_ind, test_ind in kf:
    #Get the persons of k-fold
    train_pers = unique[train_ind]
    test_pers = unique[test_ind]

    #Set train+test stack to empty
    self.train_stack = type(self.pca_data[0])
    self.test_stack = type(self.pca_data[0])

    #For all test data
    for data in range(len(self.pca_data)):
        print(self.pca_pers[data])
        if self.pca_pers[data] in train_pers:
            #Add to train stack
            self.train_stack = np.vstack((self.train_stack, self.pca_data[data]))

        elif self.pca_pers[data] in test_pers:
            #Add to test stack
            self.test_stack = np.vstack((self.test_stack, self.pca_data[data]))
        else:
            #Something wrong
            print(data)
            sys.exit("Strange strange data")

    fold += 1

此处的导入代码为:

#Set train+test stack to empty
self.train_stack = type(self.pca_data)
self.test_stack = type(self.pca_data)

#Add to train stack
self.train_stack = np.vstack((self.train_stack, self.pca_data[fold][data]))

self.pca_data 包含所有图像数据,此数据必须通过 self.train_stack self.test_stack 进行分发。我尝试了 type()函数,但这似乎是错误的。我也尝试了 self.train_stack = [] ,但这引发了错误“ValueError:数组维度必须同意,除了d_0”。如果我使用numpy.zeros,那么第一个堆栈是0,我希望它在vstacking之前完全为空。

问题

初始化空numpy数组的正确方法是什么? (输入'numpy.ndarray')

P.S。请注意, self.train_stack 处于循环中,因此如果变量不存在,则if语句在第二次进入循环时不会重置变量。

变量

  • self.pca_data:Shape(978,20)Type(type'numpy.ndarray')
  • self.pca_pers:Shape(978,1)Type(type'numpy.ndarray')
  • self.test_stack和self.train_stack应该是例如形状(489,20)和形状(489,20),如self.pca_data
  • 您可以忽略的其他变量

1 个答案:

答案 0 :(得分:1)

避免在循环中调用np.vstack。每次这样做, 分配一个新数组,和 来自原始aray和新行的所有数据都复制到新数组中。 所有这些复制使得这种解决方案比必要的慢。

如果我们可以假设self.pca_data的每一行都属于self.train_stackself.test_stack,那么您可以替换整个for-loop

for data in range(len(self.pca_data)):
    ...

调用np.in1d创建一个布尔掩码,然后 通过使用掩码索引self.train_stack来定义self.test_stackself.pca_data

for fold, (train_ind, test_ind) in enumerate(kf):
    train_pers = unique[train_ind]
    mask = np.in1d(self.pca_pers[:,0], train_pers)
    self.train_stack = self.pca_data[mask]
    self.test_stack = self.pca_data[~mask]

例如,np.in1d创建一个布尔数组,当元素为True时 在第一个数组类似于第二个数组:

In [544]: np.in1d(range(5), [1,2,4])
Out[544]: array([False,  True,  True, False,  True], dtype=bool)

和布尔索引可用于选择如下行:

In [545]: mask = np.in1d(range(5), [1,2,4])

In [546]: x = np.arange(10).reshape(5,-1)

In [547]: x
Out[547]: 
array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7],
       [8, 9]])

In [548]: x[mask]
Out[548]: 
array([[2, 3],
       [4, 5],
       [8, 9]])