我已经删除了图像数据,现在我希望将其拆分为训练和测试集。 但是,如何初始化一个空的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语句在第二次进入循环时不会重置变量。
答案 0 :(得分:1)
避免在循环中调用np.vstack
。每次这样做,
分配一个新数组,和
来自原始aray和新行的所有数据都复制到新数组中。
所有这些复制使得这种解决方案比必要的慢。
如果我们可以假设self.pca_data
的每一行都属于self.train_stack
或self.test_stack
,那么您可以替换整个for-loop
for data in range(len(self.pca_data)):
...
调用np.in1d创建一个布尔掩码,然后
通过使用掩码索引self.train_stack
来定义self.test_stack
和self.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]])